I would say that migration to Flex 3 vs Flex 4 is much of a muchness, since both support mx components.
As far as I remember, the migration from Flex 2 to Flex 3 is trivial as far as code changes & build errors go. I do remember having some weird styling issues though & having to revise / tweak a lot of the styling in our app because things no longer lined up properly (particularly using stroke assets in panel backgrounds - removing the strokes & replacing them with fills fixed the bulk of the issues).
Migrating from Flex 3 to Flex 4, there are some minor compilation errors and even less if you choose the compiler 4.1 + check the option 'Flex 3 compatibility mode'.
It might be worth getting hold of the latest Flash Builder & then compiling your project with the Flex 3.5 SDK (a compiler option). Once you are happy with the look & stability of your app, it should be a trivial matter moving over to Flex SDK 4.1 + 'Flex 3 compatibility mode' ... and then eventually unchecking the otion 'Flex 3 compatibility mode'.
For full blown Flex 4 goodness you can eventually use the new spark component framework, but this is not neccessary for migrating to Flex 4 (as Flex 4 runs interchangeably with mx and spark components). It also might not be advisable to convert your existing mx-based components to being spark-based since the spark component base is still quite limited. We have a large mx-component based app. As we create new components we use the spark framework, to make use of the performance / display improvements it offers. Eventually over time we will convert our heavier mx-based components to use the more lightweight spark framework.
Thank you maziak!