Using dedicated servers doesn't mean you're not using virtualization - it just means you're the one managing it. You control the hypervisor and the vms running on top of it.
Because of that, you're actually less tied to a specific hosting provider since you're not reliant on their APIs to set up and manage your infrastructure.
Even if you're not using virtualization there are still plenty of ways to migrate your servers.
One of the most common approaches (which was the thing before docker took over) is managing servers with an IaC approach using tools like chef, puppet, ansible, saltstack etc.
With IaC you define your entire infrastructure in configuration files and deploy those configs to your host.
It's a bit like docker swarm but for managing physical and/or virtual servers instead of containers.
Another popular option, often paired with IaC, is to create your own pre-configured *nix images tailored to your needs.
For example, you might have specific images set up for your load balancers, db servers, file hosts, or other roles in your stack.
I've worked at a company where we handled migrations using dd.
Technically that's also an option.
Wouldn't recommend it tho.
Even if you're not using virtualization there are still plenty of ways to migrate your servers.
One of the most common approaches (which was the thing before docker took over) is managing servers with an IaC approach using tools like chef, puppet, ansible, saltstack etc.
With IaC you define your entire infrastructure in configuration files and deploy those configs to your host. It's a bit like docker swarm but for managing physical and/or virtual servers instead of containers.
Another popular option, often paired with IaC, is to create your own pre-configured *nix images tailored to your needs. For example, you might have specific images set up for your load balancers, db servers, file hosts, or other roles in your stack.
I've worked at a company where we handled migrations using dd. Technically that's also an option. Wouldn't recommend it tho.