Here is a solution using just ggplot2 stuff and not modifying any grobs. It requires ggplot2 3.0.0 and is based off https://stackoverflow.com/a/51312611/6615512
library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
tick_min_pos_odd = -0.6
tick_min_pos_even = -0.4
custom_ticks = data.frame(cut = sort(unique(diamonds$cut)))
n_discrete_x_values = nrow(custom_ticks)
# Alternate tick lengths
custom_ticks$tick_min_pos = ifelse(1:n_discrete_x_values %% 2 == 0, tick_min_pos_odd, tick_min_pos_even)
ggplot(diamonds, aes(cut, carat)) + 
  geom_boxplot() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +  
  geom_linerange(data = custom_ticks,                        # The custom tickmarks
                 aes(x=cut, ymax=-0.25, ymin=tick_min_pos), 
                 size=0.5, color='black',
                 inherit.aes = F) +
  coord_cartesian(clip='off', ylim=c(0,NA)) +        # Clip off makes it so the geoms can be drawn outside the plot
                                                     # ylim sets the y-axis from 0 to the max.
  theme(plot.margin = margin(0,0,20,0),              # Add some whitespace to the bottom of the plot
        axis.title.x = element_text(vjust=-1.5),     # nudge the x-axis title and text down a tad
        axis.text.x = element_text(vjust=-1.5))
