My paradoxical answer would be, consider having ONLY custom fields. Let me explain.
I totally, totally relate to this question. I'm the author of BugTracker.NET. At first, my philosophy was "my way or highway", but I did give get convinced to support custom fields. At first, the custom fields didn't behave as well as the built-in fields, but over the years I've improved the behavior of the custom fields to the point where their behavior is nearly the same as the built-in.
So, I'm kinda, sorta thinking:
The codebase would have been cleaner if I had implemented the built-in fields as custom fields. That is, the built-in fields would have been just a set of pre-configured fields out of the box, that used the same mechanism as client-added custom fields. Right now, throughout my app, I have blocks of logic for the built-in code and completely different blocks of logic for the custom fields. There could have been just one block, for the custom.
I don't think you would want to add everything that any client ask for. Simplicity is a virtue, and every field you add, while making one customer happy, risks being perceived as clutter and complexity by others who don't need the field. People who like BugTracker.NET often mention its ease and simplicity. People who don't like it mention that it can't do something complicated that they want to do (usually related to permissions, another part of an application that can be a big mess). Without a good infrastructure for custom fields, you have to balance the two audiences, but with a good infrastructure for custom fields, you can keep it simple out of the box and let the folks who like complexity make themselves happy.