TriangleMesh
A batch of triangles with a colour at every corner, drawn in a single call.
Compose draws paths, and a tunnel drawn as paths reads as a wire frame because it is one. This fills the space between the lines instead. Each corner carries its own colour and the graphics card blends between them across the face, so lighting worked out once per corner comes out smooth over the whole surface. A few thousand triangles cost one call, where the same number of filled paths would cost a few thousand.
Build it once and reuse it: clear at the start of every frame, add corners with vertex, join them with triangle or quad, then hand it to drawMesh. Nothing is allocated after the first frame unless the number of triangles grows to a size the mesh has not drawn before.