To be perfectly honest, if you're looking to actually keep the content you already have, this kind of meddling is best dealt with by simple augmentation and field visibility, in my opinion.
Having lots of content types is not really workable; there's a multitude of scenarios like search and views where pulling from multiple types is just not "working smart".
The way I see this is that, if I correctly understand it, CCK will basically create tables automatically for you for your fields; if you add fields, it adds more stuff to the schemas and tables. If you want to "remove" fields, CCK will scrap this data, ergo it will no longer exist.
The best way to go about this then, as I see it, is to periodically augment your one content type with the new fields, and simply hide the "old" fields with a field visibility module. If you're so inclined, you could do that programatically as you alluded to. Your old data is still available in the same type (and tables) in this manner.
For "versioning" output of your type, then yes, in theory you could add a version field to the type, but if you're periodically changing the fields (and consequently the node form) then it seems likely that you could just alter the output as easily. You would probably have to update various views and node templates in any case. Display suite module might help you accomplish that last bit more easily - UI to handle node display etc rather than keep getting your hands dirty in templates (useful if updating frequently?)