This documentation page on #Blender's internal mesh data structure is really good: https://developer.blender.org/docs/features/objects/mesh/bmesh/ It has very thoughtful comparisons to half-edges.
I stumbled upon it when researching mesh libraries for Python that support N-Gons. Perhaps I'll try reimplementing BMesh myself.