Hey Christopher,
It is totally ok to completely skip the component system. If you prefer or feel more comfortable making singleton classes and hard-coding the game to init them, that is a completely fine way to make things work. Components are a newer and less mature part of the codebase and the vast majority of the codebase does not interact with them.
As far as the scripting integration goes, if a script object lives purely in script, it obviously doesn't need to have any reflect backing. But for getting data from native to script or script to native, the reflection system would be a way to data-drive that. Calling from native into script, you're right that reflect won't help you much there as reflect doesn't know what is in script. But I still think you could use reflect to serialize structs as parameters or otherwise shutting data out of script into native. It will depend a lot on how you want to use script though.
The patching scenario is a good one to consider. helium doesn't have any sort of built in patching although I don't think it would be terribly difficult to change the caching system to write out to a separate cache location to make a patch, and have the game check multiple cache files in order of patch "priority." I'm not very familiar with patching systems though. I would still try to work with loose assets and integrate the VFS system of your choice into the cache generation phase of the pipeline.
The reason components use definitions is to separate your configuration data and your instance data. There are a couple advantages of this. First, memory considerations. If you have a few thousand isntances of an object, keeping the configuration data out of instance data can save memory. The second is for live asset reloading. Helium has the ability to load assets and swap them at runtime (very experimental.. it's pretty recent functionality). If you keep your configuration data in definitions and your instances point at definitions, then updating all instances of objects to use the new configuration is accomplished by just reloading the definition. Definitions are generally supposed to be read-only data that is shared by instances of components.
As an aside most engines I am familiar with construct objects by cloning them. Definitions remove this necessity as well - they're a pointer instead of a full copy.
Regarding definitions being passed into Initialize and Finalize, these two functions are a two-phase init. Initialize is called on everything first, then Finalize. This is so that components can deal with circular dependencies on init. In retrospect, maybe Finalize() would have been better named "FinishInit()"
Philip