GPUs render various primitives like points, lines, voxels... But when you render a surface, it will be rendered using only triangles.
So when you have a quad or "n-gon" face built on more than 3/4 verts, it still will be rendered using triangles.
In other words, quads and n-gons are Blender abstraction to make it easier to work with a mesh (e.g. loopcuts don't work on triangles, because when you enter a triangle, you don't know which way to go next, in case of a quad it's the opposite edge).
Upon rendering (also in viewport) or exporting to formats that support only triangles, your mesh is triangulated. What you see is the boundaries of the resulting triangles. You can control this internal triangulation in various ways:
How to fix inconsistent behavior of two quads defined by the same corner vertices?
Edit face triangulation without actually adding edge
However, your problem is caused more by how smooth shading works. Try 'hardening' your normals:
Why do I have this weird shading issue?
or add a buffer of quads, so that all n-gons are surrounded by quads with the same normals, and therefore there is no normal interpolation within the n-gons:
Above you can see a buffer of quads between the holes and 3 big n-gons, but the n-gons still touch the edges of the silhouette of the object - so there should be additional edges like so:
And then keep in mind if you use Subdivision Surface + Smooth Shading, then ideally you want a buffer of 2 layers of quads, because one such layer will be moved by the Catmul-Clark algorithm and so it will no longer be co-planar with the quads…