From ?labeling I learned there were several "behind the scenes" functions that accept arguments from mosaic and tried a couple of changes:
?labeling
I believe this is closer to what you were hoping for:
mosaic( ~ A + B, data=mydf, highlighting="A",
highlighting_fill=brewer.pal(9, "Set3"),
labeling_args=list(tl_labels =c(TRUE, FALSE) ) )
Sets the row labels to the bottom and uses the lower cell locations for placement. (Still have overlap of 'h' and 'i' but they can even be resoved, whereas you had overlap of a-e before.)