I think you're right that Salt/Puppet and to a lesser extent Chef take the wrong approach, but you make some confusing comments that make me suspect you might not understand what these existing approaches are about.
> IMHO, the overwhelming problem with salt/cfengine/puppet style solutions (which I will refer to as 'post-facto configuration tinkerers', or PFCT's) is that they potentially accrue vast amounts of undocumented/invisible state
I think you mean "post-facto" as in: "run after everything is done"? This is not the way that people would advocate Puppet should be used. Puppet should be used from the start, not added as an afterthought once you are done.
> IMHO, a cleaner solution is to deploy configuration changes from scratch, by deploying clean-slate instances with those changes made
This isn't a cleaner solution, this is almost the solution you get when you use Puppet. With puppet the development workflow is like this:
- Span up a vagrant VM
- Run your manifests against this VM to test them
- To check in, run your manifests against your staging environment
- To deploy, spin up new clean production VMs and run puppet manifest against them
- Use a reverse proxy to route all traffic to new production VMs. Terminate old production VMs
> PFCT's deployment paradigm tends to be relative slow and error prone.
This much is true. Puppet's slow speed is particularly galling, but maybe that's just because I use it at work.