Your second "Con" point under the Terraform section is false.
"Declarative languages require the use of dependency mapping when deploying (example: deploying a VM without networking first, will error out)"
Dependency mapping is automatic in Terraform and does not need to be manually configured. For example, deploying a VM (EC2 instance) requires assigning the VM to a VPC subnet. Presuming the subnet is configured in the same Terraform state as the VM, Terraform will implicitly create the subnet before creating the VM, or delete the VM before deleting the subnet, even if these resources are configured in different modules.
This extends even into very complex environments with thousands of resources. Terraform will automatically figure out the entire dependency tree (you can even print it out), and create|modify|delete resources in the order required.