The secret trick I've used on rare occasion, but when necessary, is the "ten second rule."
Users don't notice a deprecation warning. But they might notice adding a "time.sleep(10)" immediately at the top of the function. And that gives them one last grace period to change out their software before it breaks-breaks.
Just break, then revert when anyone complains, on every single release. eventually you will get a release where nobody complains as they move off the depreciated api due to breakage annoyance.
This will just waste CI compute and not solve anything.
This is so much worse than just making the breaking change.