The accepted best practice is to automate the creation of VMs via infra as code and configuration management. Then only backup the necessary data.
This has a large number of advantages.
* You don't backup standard system files / binaries, reducing the cost of your backup storage space.
* You don't carry forward corruption in system files, requiring bisection of backup snapshots in order to find the corruption. Instead you can simply wipe the system and restore the data.
* Your system is more reproducible, as your restore tests fully exercise the creation of the VM from scratch.
* Upgrades are easier, you can use your automated provisioning to create a new instance with whatever new software loadout you want. Then restore backups and test.
This has been a standard recommendation for at least 10-15 years.