Ideally you implement a middle ground of declarative (but not necessarily immutable) infrastructure where changes are diffed. Terraform does this pretty nicely.
I hear what you're saying, but we've got elastic search in Terraform as a module, and you dare not make mods to an existing cluster; Terraform will dutifully tear that cluster down depending on the changes you make (I mean, sure, use a "plan" first, but still).
Immutable infrastructure is great for stateless micro services, everything else not so much.