The project I've been working on far many, many years lies somewhere between off-the-shelf and 100% custom software. That is to say that while we as the developers try to control the product, the clients that use it each have their own ever changing needs and priorities which we strive to meet. This often means making custom changes for two or more clients simultaneously between official "releases".
My junior developers would prefer to build an all-inclusive foundation, the equivalent of the giant unmovable slab of concrete. In an ideal world, with total control over the release of new features and a crystal-clear vision of the future, this might be a wonderful idea.
But that's not the real world. Modularity and configurability are essential ingredients required to balance the needs of many clients with a single code base. Our foundation is more like a medium-sized slab of concrete combined with some solid building blocks. Even so, there are times when there's just not quite enough flexibility in some particular part of the product.
In the end, it's a matter of weighing unknown probabilities against each other to determine the right mix of concrete and flexibility. The best you can hope for is to be right more often than you're wrong.