I usually <i>don't</i> rewrite, unless the client specifically agrees to that work. Often it's not much extra work, but it's still over and above what they've asked for.<p>Instead, I'll usually write some documentation explaining what I've learned about how the system works. If it takes me a few hours to reverse engineer a particular set of code, documenting that up often only takes a few minutes, and will save me and future people a lot of time. But... I've not had to change <i>how</i> the system's working.<p>In almost all these cases there's 0 tests - in some cases the code isn't really even <i>testable</i> in the first place. If I think I'm going to have a long term relationship with the project/client, I may push for refactoring or rewriting, but if this is a short 'add a feature', I just document what I can that will be useful, and do the work.