This doesn't directly answer your questions, but some time ago I wrote a basic code to do what you're looking for. It extracts the orientation and inclination of RoofSurface polygons in CityGML, to estimate the solar irradiation of rooftops. The code is released on Github, so you might want to have a look. The part of the code that would probably interest you is here. The program creates a new enriched CityGML file with the information about each roof polygon. It's in Python and it's fairly simple, but I remember that it worked with large datasets.
Note that lots of polygons in publicly available CityGML data are not planarlots of polygons in publicly available CityGML data are not planar and contain other types of inconsistencies, hence the calculations may containresult in errors. My code has a built-in check for planarity to skip invalid polygons, but for more sophisticated validation you can use the free online validator val3dity.
By the way, with respect to your sentence:
Only one of them is in such a good condition that it includes the orientation and inclination angles of every roof polygon (as a gen:stringAttribute).
CityGML does not mandate attributes of the orientation of polygons and similar information, so the presence of such information doesn't say much about the condition of the data.