I would say that the jist of it is that you shouldn't drastically modify the source DOM between runmodes. This is because your Authors are editing contextually, and tend to rely on the idea that what they see rendered in Author can be assumed to appear and behave as it would for users on the Publish instances. Modifying things in the delivered markup such as HTML tag hierarchies -- even slightly -- can introduce inconsistencies and bugs that are sometimes to subtle to be easily tracked down.
It's better to instead just account for these additions in your initial HTML. There are situations where you may not be able to easily do this because, for example, you inherited the markup, or it was delivered by an outside or otherwise disengaged party. In these cases, leveraging the cq:htmlTag feature of components, which can influence how the enclosing container is drawn, can lessen the impact these otherwise additional tags might have. This way you can -- in effect -- use the same markup to pull double-duty: it will be drawn as the container you expected in your static markup's DOM (including the tag name and any in-house styles you need) and still allow CQ to use it for its own needs.
As for whether the class names used by the author (parbase, parsys, etc.) should be stripped from the Publish version, I would tend to say no. At worst they're harmless remnants; but, more importantly, they may not be as vestigial as you might think. In fact, it's not an uncommon practice for components to use these class names for various things, even on the Publish.
Hope this helps!
-Josh/XumaK