First, let's differentiate between upgrading to D9 and migrating to D9. It's not just semantics. If your site is built on Drupal 8, you'll upgrade to Drupal 9. If your site is built on Drupal 7, you'll migrate to Drupal 9.
At a high level, this means one is more complex than the other. Drupal 7 and Drupal 9 are two completely different codebases. So, in order to move from Drupal 7 to Drupal 9, the codebase of the D7 application needs to be evaluated and (in many cases) sections of code need to be re-written to conform to the new standards on which D8 and above are based. It's a labour-intensive process and the reviewers must be meticulous when evaluating code, content and configuration.
Going from Drupal 8 to Drupal 9 (and all subsequent versions) is significantly less complex because your D8 codebase is (for the most part) already D9-ready... and if your Drupal 8 site was properly architected and kept up-to-date then the move from D8 to D9 is more accurately termed an upgrade, as opposed to a migration.
The next important thing to address is time frame. Drupal 7’s end-of-life (EOL) is November 2022 and Drupal 8's EOL is November 2021. If you think you have plenty of time to migrate your Drupal 7 site - you don't. Beside the fact a complex D7 application can take quite a bit of time and effort to migrate, the best agencies are filling their schedules - quickly! Wait too long and you could be in for a very unpleasant surprise.
Regardless of whether you're upgrading or migrating, the best place to start is with a Drupal 9 Readiness Audit by Thinkbean. We'll accurately assess the resources required (time-line, effort, budget) for either path and provide recommendations as to what you'll need to do to prepare for clear sailing to Drupal 9.