I developed a large and complex system about five years ago. I spent the next five years introducing myself into every project that influenced "my" system to keep barbarians from the hustle and bustle of my architecture. While I applied constant, unforgiving pressure, I was able to keep the architecture pretty clean, but I struggled with a lost battle. That's why:
1) Most people evaluate if they did the work today. No one was ever reprimanded because three years ago they cut a corner (or two) to get the project on time. On the other hand, many people were reprimanded for not having time to receive projects on time.
2) You might want the system to be neat because you have a sense of ownership of the code or application or users, etc. Many people will not have a sense of ownership and are therefore too happy to hack into something to handle. You can lead a horse to water, but you cannot take care of it.
3) If you convince everyone to properly maintain the code, new people will come aboard, and they need to be taught how to do the right thing. Therefore, even if you succeed, you may feel that you are failing because you are always fighting the same battle against new opponents.
4) Perhaps you are mistaken. Will Microsoft think that Microsoft will spend twice as much time programming to make MS-Paint reliable and easy to maintain? Sometimes an ugly hacking system is good enough. Most good programmers do not understand this, but usually because they are good programmers.
5) I swear that there are people who take perverted pleasure from breaking things, either because they can do it faster, or they will be the only ones who understand this, or they have a childhood need to break the rules. You cannot reason with these people, and the more time you spend with them, the closer to the project completion date, which in any case will force you to hack something.
6) A good chance that you understand the system better than they do. What looks like an ugly hack to you may look like a “slightly stepping” to someone who is not so familiar with the system. Or additional efforts to make the code reliable will protect the programmer from a problem that he had never encountered before, and therefore cannot peek. You do not learn to check return codes until something works, because you have not checked the return code. At this moment, he ceases to be "additional work" and begins the "required work".
If you have a small, tight development team, this is possible. But the larger the organization, the less likely you are to succeed. If you manage to get a 250-local IT store to evaluate how to do it all right, then your persuasive abilities are legendary.