@Demerit pointed me to this https://docs.civicrm.org/dev/en/latest/framework/token/#token-processor
Aside from being new and shiny, it's using some symfony bits which Drupal also uses so it kind of feels like a nice fit.
In my initial testing, I've observed that the example code in fact only fills in the gap - i.e. the tokens don't show up in the listing, nor do they work in a traditional mailing, but they do show up in a mosaico mailing!
So I've implemented this as well as the existing hook_civicrm_tokens and hook_civicrm_tokenValues, and it appears to work.
Presumably the worst that could happen would be that both processing mechanisms were invoked and that would be okay.
Post script ...[2022-04-01]
It works in all my testing, but fails when the mailing is triggered via cv! I tried adding in --level=full, thinking that Drupal wasn't getting invoked in the same way as when doing tests, but that didn't make a difference.
To make matters worse, it seems to stop working after different kinds of upgrades, and then start working, i.e. perhaps it sometimes is working off a cache.