Upgrading to newer versions of Drupal in the past was a significant change effort that required substantial investment and a non-trivial release window.
However, upgrading from Drupal 8 to Drupal 9 is different; this is the first major update to the version that has a reputation for being as simple as a minor release.
Upgrading from Drupal 8
Organizations that already have Drupal 8 are several steps ahead in upgrading to Drupal 9. One of the biggest benefits is that the Drupal 8 platform and core code form the foundation of Drupal 9.
Drupal 9.0 introduces no new features or new code, so sites that are on the final version of Drupal 8 are essentially ready to upgrade to Drupal 9.0, with no big push, no major remodeling effort, no content migration, and only a final audit to ensure that the site does not depend on any outdated code or outdated Composer dependencies.
Sites that have been kept up to date with Drupal 8's incremental updates should be good to go when it comes to core code.
Many sites are already using automated tools or workflows to keep sites free of outdated code for custom and contributed modules. If so, your site update effort should be relatively simple. The same is true if you rely on widely used and well-supported contributed modules and have little custom code.
If you have custom code and use less-used contributed modules, but you've paid attention to debugging obsolete code in your custom code and preparing your contributed modules, you're probably in a good position to upgrade. If you have strong test coverage and don't rely on any outdated third-party dependencies, you're in better shape.
You shouldn't see any substantial changes from Drupal 8 to Drupal 9.0, so even custom code will likely work without problems as long as it doesn't depend on deprecated functions or methods that are removed.
The caveat is that if your custom code or contributed modules rely on older versions of Composer dependencies, which are deprecated in Drupal 9 in favor of newer versions, you may need to do some refactoring to make sure the code works. with new third-party dependencies.