Very general: if the "counters" for states that require mutiple cycles are relatively small, the most efficient way (in terms of speed and area) is likely to use multiple states, as you more or less showed in your example. But that's likely true only for a limited number of overall states; beyond a certain number, FSMs will become inefficient when synthesized.
Still, one drawback of doing this is that it makes your code hard to maintain if you ever need to modify the individual "counters" or make them generic. Likewise, it more or less forces you to use integers as states rather than identifiers, which also makes code harder to read and harder to maintain.
So, my personal view on this is: unless you know the number of counts will forever be fixed and is small, don't do it.
If you want to do this and make code easier to maintain, at least use constants instead of hard-coded values for the states in your 'case' statements. Declare those constants with a clear identifier, and each computed from the previous "state", so it becomes much easier to read and maintain. Pretty please avoid using hard-coded values.