The mul-shift part is what any optimizing compiler does for known divisors and has done since the 90s, if anything it was more vital back then when the gap between div and mul was wider than today.
The gap is only growing. At lower clock speeds it was easier to have a smaller gap between the slow instructions like div and fast instructions like mul.