It's always good to use Vagrant (or any other method to be quickly able to refresh the dev environment) and routinely do destroy/up. This is for me so far the best precaution to keep the application light on dependencies.
The more services/external dependencies you cram into single commands... the more maintenance (of that cramming) is required.
I agree that it's not always possible to set up everything automatically but with a shared encrypted filesystem, good instructions, and tools like Foreman you can go a long way.
In case something can't be set up automatically we usually have a clear README and the initializer prints a note about where to find instructions about getting it running.
Maintaining the install script isn't much more painful then setting up it by hand, especially if you make sure the script is ‘reentrant’.