As already mentioned going version by version is the best way to tackle this. Try to fix the deprecations incrementally.
The only caveat I would say is that if you plan to get onto 2.4 right away you might be refactoring a lot of code anyway so it probably is useful to try a branch of your project using the latest and greatest. The issue is a lot of subtle things will be broken so you need to figure out how to divide and conquer the deprecations and missing API features your app currently might depend on.
I strongly recommend using the deprecation workflow add-on to manage the deprecations and isolate the specific issues. You can certainly try to do this all at once with a jump to 2.4 but you will be changing a lot of code all at once to get your app back to a stable state. But if you go the incremental step you will likely be refactoring things multiple times as you trace through how the API and best practices have evolved.
I did the upgrade incrementally, but if I were in your position today I would peek at what is broken by jumping straight to 2.4. The hardest part is that some things will just be broken because of removed and missing APIs in 2.x branch of ember. So identifying those can be confusing because you might not see deprecations just missing API features.
This addon will be a life saver though:
Also, carefully read through the deprecation guides this will give you a sense of what to do in your code in specific scenarios
Good luck. It is not as scary as it seems and it gives you an opportunity to refactor your code to newer cleaner patterns anyway. Especially if you have time to work through it methodically.