Require v8 only contrib module with v9 patch Given I have Drupal 9 composer installation with composer-patches plugin
and given a contrib module with a stable v8 release, but no v9 release (not even dev branch)
and given that contrib module has a working v9 patch in the issue queue

is there any method to install that module + patch in composer? Even if I manually add both, the package and patch, to my composer.json, I still can't require or update this module with composer due conflicting versions. I really want to avoid duplicating /contrib code into my project's /custom codebase. My current workaround is:

forking that module to my own, private git repo
applying patch there
creating a new composer.json in my private git, and changing the package vendor to my custom_private_vendor
adding my private git as VCS repo in the D9 project's composer.json
and then composer require custom_private_vendor/contrib_module

This fulfills my goal of not duplicating the contrib module in my project's custom codebase, but every time I do this I feel the urge to wash my dirty hands.
Is there something more elegant like composer require drupal/contrib_module --apply-patch-first or can I somehow target drupal.org's git with a specific patch included?
You've got the right idea but you don't need to fork Drupal's repository. You can set up composer to read Drupal's git repo instead of using packagist for the naughty modules like this:
    {
        &quot;type&quot;: &quot;package&quot;,
        &quot;package&quot;: {
            &quot;name&quot;: &quot;drupal/cache_control_override&quot;,
            &quot;type&quot;: &quot;drupal-module&quot;,
            &quot;version&quot;: &quot;1.0.0&quot;,
            &quot;source&quot;: {
                &quot;type&quot;: &quot;git&quot;,
                &quot;url&quot;: &quot;https://git.drupalcode.org/project/cache_control_override.git&quot;,
                &quot;reference&quot;: &quot;8db91684a427366d8f9c51f60cbac10c2d586d95&quot;
            }
        },
        {
          &quot;type&quot;: &quot;composer&quot;,
          &quot;url&quot;: &quot;https://packages.drupal.org/8&quot;
        }
    },

Note the 'reference' is a commit hash, though it looks like you can also use tags. Also note that the custom git type: package repo must be before Drupal's default type: composer repo in your composer file.
And then patch as normal using composer:
&quot;drupal/cache_control_override&quot;: {
    &quot;Drupal 9 Compatibility (3132036)&quot;: &quot;https://www.drupal.org/files/issues/2020-04-29/Drupal-9-readiness-3132036-2.patch&quot;
},

Thanks @miststudent2011 for pointing out that this doesn't automatically install dependencies which I can confirm. You will need to require those yourself!
(Shamelessly stolen from @acbramley on Drupal Slack because wider dissemination of this knowledge is worthwhile)