Honestly in my opinion, NGons should never be present in a final model. Every artist will have slightly different opinions on this but here is my take.
When NGons are okay
- On completely flat surfaces, bordered by a quad loop.
- Hidden areas of models that will never be seen or used for any reason (but this still sloppy and not desirable)
- As a temporary holding surface that will later be replaced with clean quads.
When NGons are not okay
- On any model that will be exported to another artist or engine
- On a model that will deform through animation
- On a model with SubD (unless that area is completely flat, and surrounded by a quad-loop)
There's many different reasons for each of the above, but here's a few:
- NGons should not be used on deforming models as you want to have absolute control over how the surface is generated and how it appears at render time.
- NGons should never be used on a model that is being exported as you don't necessarily know if the importer on the other side will support NGons or if the next artist will treat them as you intended.
- NGons should never be used on real-time models as you won't know how they'll be triagulated.
In general, I like to use NGons as a temporary topology block. But I never keep them in my final models.