I suspect a bit of it is. I reworked the code to remedy some other issues, but I have found that adding more resolution to one shape helps. You can think of the goal I am working towards as having a large block of "wood" (right now a CSGBox) with a CSGCombiner of CSGCylinders arrayed to define a wiggly pipe like path. The pipe is smallish compared to the box (2mx2mx.5m)
The idea is to produce a final shape that is the box with the 'pipes' routing a groove, in the same way taking a real router to a block of wood or metal. Adding more subdivisions to the block shape reduces tearing. That suggests that tessellation of large triangles when intersected by a set of smaller ones isn't quite perfect, but more regularly the 'pipe' faces that not intersecting the box surface and form the trough of the route break badly. Not sure if it isn't just bad normals or poorly formed tris.
It is nice to know though that the mesh for product combiner shape itself can be extracted for other uses. The only caveat is to know that CSG operations are deferred, so you need extract after the operations have had a chance to take effect. css-thing.get_meshes() then has a composite mesh in it.