For most teams that I've worked in, I've chosen certain parts to guard and nurture into a better state. I'll recognize certain shortcomings that have a real-world negative impact and incrementally nudge the design and future decisions in that direction. At some point it will have arrived. Eventually people that are in non-adjacent teams gets to know that I'm the XyzService person. I do socialize the design and implementation changes and even distribute the work and write up thought/decision processes for the team to see. I'll eventually run out of challenging work and move on to another sore area with the team well capable of managing what they've got. If the process were to be interrupted at any time, it's generally not in any worse shape than it started, only failing to reach the desired end improvements.
Edit: My current pet project is eliminating a bad DSL which has led to so many bad implementations and near-identical but different copies because factoring aspects isn't well supported. I started with a PoC, then a Hackdays project, and now with that looking good, the team is willing to convert all of the codebase we maintain so that we can use normal programming language features like static typing and source navigation with easy to follow data flows.
Edit: My current pet project is eliminating a bad DSL which has led to so many bad implementations and near-identical but different copies because factoring aspects isn't well supported. I started with a PoC, then a Hackdays project, and now with that looking good, the team is willing to convert all of the codebase we maintain so that we can use normal programming language features like static typing and source navigation with easy to follow data flows.