There are some apps around that will claim to offer this functionality. However, they are basically task killers under the hood. This means they will allow the app to load, and then kill it. This means that extra battery power is used to kill the app, and then it will probably be reloaded on some event trigger later, only to be killed again.
Honestly, if you use these apps, and don't want to uninstall them, the best thing is to just let them load. They will use a bit of memory, as long as there is some that isn't being used. As soon as something needs the memory, then the system will kill the app - and believe me the Android system has a better idea of which tasks to kill than any dumb task killer.
There is a good description about why task killers are a bad idea here: http://forum.xda-developers.com/showthread.php?p=6426198#post6426198
Otherwise, there is no way to do this on an unrooted phone, unless the app specifically gives an option to disable auto-startup. On a rooted phone, however, there are a range of apps that are able to actually change the way broadcast intents are delivered to apps, meaning they can pre-emptively be prevented from starting.
To be honest I struggle to think of a reason that an app might want to load a service at startup, that it couldn't achieve by just registering a broadcast listener. Services should typically be used for background tasks that have a limited lifetime. Some apps may load a service at startup to do some processing, but will then typically close it once that processing is complete.
However, that said, not all developers understand the rules. I would rather uninstall a badly written app that consumes resources like this.