I always code new pieces separately, It makes things much easier to debug as well as reducing compile times. Another advantage is that the code can easily be used across multiple projects with little to no modification, and I find the optimization process goes much smoother without all the other pieces to worry about.
Quote: "that'll work for multiple levels?"
It can (and usually does), but you should at least have an idea for your final engine functionality and layout to ensure you don't code yourself into a corner. If you write functions to destroy what each piece creates, then it would be just a matter of re-initializing the things which change from level to level.
The only problem that I've come across is when more than a single 'module' uses the same function. You can wind up with a few different functions which do the same thing, which can lead to some frustration down the road. To solve that, I usually create a "common" source file which includes those cross-module functions, along with comments that specify which modules use each function. It really helps incase you decide to wrip/re-write pieces from your engine later.