Vercel (for instance) does pure serverless --- you configure "functions" that are invoked by their orchestrator --- that are all Javascript, or compiled to JS/WASM.
Fly.io takes Docker containers, turns them into VMs, and lets you decide where and when to have them running.
One isn't better than the other; they're just totally different models for hosting applications. The Fly.io model is much closer to what Heroku did, just modernized (with Docker, edge deployments, the `fly-proxy`, etc).