tokio supports a single threaded executor when you really need it, and its not even hard. It's called a LocalSet in tokio's API:
https://docs.rs/tokio/latest/tokio/task/struct.LocalSet.html...
https://docs.rs/tokio/latest/tokio/task/struct.LocalSet.html...
If you try to use axum in this way you'd still need to use send and sync all over the place.