As I sit here trying to figure out which of my unpalatable options are the least expensive, I realized that the problem is there is no way to export a Heroku project in a format that could be just moved to another server and run.
Imagine if there was a command that created a zip archive, with everything, all the source files, and system variables for my app. Then you could upload the archive to another service, in the exact format produced by Heroku, point the CNAME at their server instead of Heroku's, and as soon as the DNS propagated it would just start running in the new location without skipping a beat.
We need open formats for apps too. Never should have let this mess come about.
Because all my data is stored in S3, it seems very doable. I'm running in a commodity OS and environment (Linux/Node).
The cautionary tale of this mess is that never again should I allow lock-in be a reason to keep some app running on a service. Heroku should be replaceable, and I shouldn't host anywhere I can't easily transition out of.
I was lulled into a sense of non-existent security. Hopefully it won't happen again.