"Just fix the spaghetti code."
Quotes such as these are a little bit... well.. misinformed.
This is a very short post, but while "spaghetti code" can cause lots of problems, many times the problems aren't related to "spaghetti" at all; code overlaps sometimes, and exceptions have to be created in certain cases where intended output doesn't match the implemented output perfectly.
Furthermore, it's not so easy to "just fix it." It takes lots of time. Anybody who's taken a class that's higher than a 101/102 level computer science class and has gotten into object-oriented languages knows that knowing all of the modules or classes you want beforehand is nigh impossible; furthermore, since League is a constantly evolving, constantly changing game, some things are bound to get hairy sometimes. And when things get hairy, solving the problems, or restructuring the entirety of a block of code (as with projectiles), becomes challenging and time consuming as well.
I get that you guys want everything perfect, but blaming everything on code being "spaghetti" is a bit of a misnomer. It's not easy to know off-hand how any given piece of code will affect every other piece of code. Even harder is knowing that making a certain change will cause problems elsewhere.
Welcome to the world of computer science :)