Since you are reading this page, you probably think you may have a structural problem with your codebase, but you don't just know how big of a problem.
Perhaps you once had a clear mental-model of your code-base, where to find code and where to put it, and changes would affect other code more-or-less as you'd expect. The effort to implement new features was consistent and predictable.
Or perhaps you have moved onto a codebase that has gone through generations of developers and the architecture is no longer (or was never) accurately documented.
Either way, you struggle to understand how your current codebase is organized, and suspect it is not.
Sometimes the developers manage to maintain this purity of design through the initial development and into the first release. More often something goes wrong. The software starts to rot like a piece of bad meat.
The developers are relentlessly editing lines of code while the higher level structures are drifting out of control. There's a sense of "everything-uses-everything" – changes have disproportional ripple effects, new features take longer to implement, it's easier to duplicate than reuse, testing cycles seem endless.
Management may be losing trust in the team's ability to deliver. Perhaps there's talk about rebuilding being cheaper in the long run than continuing with the current codebase?
Stop it now! Before you subsidize your unstructured codebase a day longer, or start something as drastic as reimplementation, at least download Restructure101 and see what it would take to salvage some or all of your code-base. It costs nothing to try, and in a matter of a few hours or days you'll know infinitely more about your problem. Then decide what to do.
You may discover that the code is hopelessly tangled, and re-implementation is indeed the way to go. Or you may be surprised how much of your code base you can reorganize into a set of components with orderly, acyclic dependencies. At a minimum you will be able to identify which sections of your code-base that should be kept or ditched, and know the interfaces before you start re-implementing.
This knowledge won't solve all your development problems, but it will save you a lot of money.