> oftentimes I'm rewriting existing chunks of code to incorporate the new features because I chose a certain structure that no longer makes sense.
You're doing it right.
> the client usually doesn't know what comes next until they need it.
Do you know what comes next? If not then designing for requirements that may not exist is likely to take your code in the wrong direction.