This view is too simplistic. I've come to the realization that ultimately software is complex because it models some very complex real-world situation. E.g. how complex can tax software be? Answer: as complex as the tax code, which is not just complex, but also contains tons of unspecified behavior. Yes, sometimes you can take a simple problem and write spaghetti code for it, but IME that is often not the real problem.