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.