For the Drupal 7 to Drupal 9 part of the upgrade you are best to look for help with the Drupal Community. But sounds like you have this in hand.
The CiviCRM specific part of the D7 -> D9 the things you'll want to think about are:
Drupal users
If you are migrating drupal users and preserving Drupal User Ids, and drupal roles and user role mappings then you can just copy the civicm_uf_match table. If not then you will want to truncate/update the civicrm_uf_match table each time you bring the civicrm database across - and populate it appropriately.
CiviCRM <-> Drupal Modules
CiviCRM Webform Integration - do you have many CiviCRM webforms? How complicated are they? It is possible to migrate CiviCRM webforms using the Drupal webform_migrate module - however you do need to patch it. However any complicated webforms you might be better rebuilding from scratch. And if you only have a couple you are probably quicker to build them from scratch in D9
CiviCRM Views - I've not seem any good solutions to automagically migrate views yet. You'll need to rebuild all of these.
CiviCRM Entity - There is a D9 version of CiviCRM Entity - however I'm not aware of any migrations for this.
CiviCRM Version and extensions
To minimise the chance of problems you are best to keep your CiviCRM version and extension versions in sync between your Drupal 7 and Drupal 9 site. (I'm assuming you will have a period of time where you are testing CiviCRM on a copy of the Drupal 9 site.)
However as you will only ever be copying the CiviCRM database from Drupal 7 site to Drupal 9 site (at the very least once to get it working to test on and another time during the go live for the Drupal 9 site) you can have more recent versions for your extensions and CiviCRM core on the Drupal 9 site than the Drupal 7 site - but it doesn't work the other way around. Just remember to run the upgrade after you import the database each time and I'd only recommend doing this if you are only jumping a few minor versions of CiviCRM core.
Installing CiviCRM on Drupal 9
In terms of the process of installing CiviCRM on a Drupal 9 site:
The following should be all you need if you are installing the latest version of CiviCRM on a site created from drupal/core-recommended - if you were installing older versions there might be additional configuration required.
composer config extra.enable-patching true
composer require civicrm/civicrm-{core,packages,drupal-8}:'~5.42'
More details instructions here https://docs.civicrm.org/installation/en/latest/drupal8/
Note this includes ->
composer config minimum-stability dev
which is no longer required - and you are probably best avoiding.
Make sure you have the correct server requirements - especially php extensions. https://docs.civicrm.org/installation/en/latest/general/requirements/
Things to think about
Ideally I'd recommend using drupal/core-recommended to set up the Drupal 9 project. While CiviCRM might work with other set ups if you can use drupal/core-recommended as a starting point you are eliminating some sources of problems and this is what CiviCRM is tested with so you are less likely to hit problems.
If you are not starting from drupal/core-recommended I'd recommend setting up a copy of the site your building and attempting to install CiviCRM as soon as possible. With a goal of proving the install will work. At a minimum test an angular page like the System Status Check page (Admin -> Admin Console -> System Status) renders properly, but if you have a lot of extensions you probably want to check they work too.
If someone is building the Drupal 9 site that is not familiar with CiviCRM you'll want to discuss with them theming requirements for any CiviCRM native pages (i.e. Events/Contribution Pages) if this is something you will want to use.
Additionally if you are using CiviCRM + webforms especially for contributions you will want to consider this as well.
You might want to have them working on a site with CiviCRM enabled but not a copy of your database just so their styles work for these pages.
Run sheet
The addition of CiviCRM to a D7 to D9 upgrade adds complexity and some additional steps. Make sure you have a good run sheet and testing is your friend.
You can copy your CiviCRM install from your live Drupal 7 to your Drupal 9 by copying the relevant database tables.
Before you go live you will want to test with a copy of your live CiviCRM database installed on your Drupal 9 site. Assuming you have a copy of the CiviCRM codebase (with a version greater than or equal to your D7 site) and the same for any extensions then all you will require is to:
Dump all your CiviCRM tables from your D7 site. These should all be prefixed with civicrm_ (So something like - assuming you have pv installed if not remove that from the pipeline)
mysqldump --single-transaction --skip-triggers database-name $(mysql -BN -e "select table_name from information_schema.tables where table_schema = 'database-name' and (table_name like 'civicrm_%' or table_name like 'civicrm_log_%' ) | pv | perl -p -e 's#\/\*\!5001[7|3].*?`[^\*]*\*\/##g' | gzip > dumpfile.sql.gz
Where the mysqldump command dumps the database taking the database name and a list of tables returned from the mysql command - which you should test first.
The pv command is optional - just shows you a progress bar.
The perl command strips out various things you don't need in the dump that can cause errors - see Why do I get "Access denied; you need (at least one of) the SUPER privilege(s) for this operation" when importing a SQL dump to CiviCRM? for more information.
the gzip command is optional if you are copying between servers you'll want to compress the output.
There is at least one CiviCRM extension which uses a non standard prefix (not civicrm) - so if you get missing table errors double check that you don't have an extension using a table that isn't prefixed correctly.
Assuming you have already installed a blank CiviCRM for testing on this site drop all the CiviCRM tables (or database if you have the CiviCRM tables in a different database).
If you haven't note you can't just copy the civicrm.settings.php file from the D7 install over - there are some differences in paths between the two systems which will probably show as any CiviCRM CSS/JS resources failing to load in the browser.
Then load the dump file into database you are using for the Drupal 9 site either into the Drupal Database (easy) or a different database (slightly more difficult).
If the path to your extension directory is different between d7 and d9 which is likely make sure that is set correctly - the easiest way to use the commented setting in civicrm.settings.php. Visit a CiviCRM admin page and ensure you don't get missing extension warnings. if you do you'll need to force a refresh either in the UI via the manage extensions page or using cv.
Set your outbound mail off and put into staging mode to prevent a cron job from triggering any payments. (Assuming you haven't overridden this in your schedule jobs page - which would be rare, in which case disable the job there).
Files - you'll also want to copy across any files that CiviCRM manages. If you check your Admin - System Settings -> Directories it will give you a path to look for these in. It might be that you don't have anything to copy. And you might be okay to just do the initial copy and the final copy and leave this step out of any intermediate copies during/for testing.
If your D7 site CiviCRM version is behind your D9 CiviCRM version run the CiviCRM upgrade.
Go live
You'll need to plan in as part of the migration the time taken to switch your CiviCRM database over - and you want to either:
- have the Drupal 7 site in maintenance mode for this period, or
- have a plan to manually copy any updates made in CiviCRM (i.e. unsubscribes, subscribes, payments etc) after you dump the tables to the time you switch over.
If the people managing your Drupal upgrade are not familiar with CiviCRM you'll want to flag this with them as they will need to build this into their plans.
If the new D9 site will live on a different server then you will need to think about the DNS propagation time too, decrease your TTL in good time to minimise this.
You can potentially set up a reverse proxy on one of the servers to eliminate this lag to minimise time in maintenance mode - however if you are okay with more downtime that is an easier solution.
If possible I'd recommend running a practice of copying your CiviCRM install across immediately before you go live, and after a freeze on any changes to the Drupal site. Build in an additional round of testing. That gives you a chance to get a good time estimate to help with your cut over planning and will hopefully pick up any last minute errors that happen.
Final Notes
If you have any custom extensions test them. If you take payments test your payment processor if possible with a live $1 transaction.
Then enjoy your shiny new Drupal 9 site. And share anything you found about the process here/with the community. With Drupal 7 end of live November 2022, and Drupal 7 still having a plurality of installs by CMS there will be a few people treading this upgrade path this year.
--
Postscript:
Migrating webforms? If only a couple recommend rebuilding but if you want to migrate you could look at using https://github.com/fuzionnz/webform_civicrm_migrate and https://github.com/fuzionnz/webform_migrate_plus - definitely backup before using.