A system that seems to work for me is to take a project to the point where I can release an MVP or a new significant update, and then go and work on something else for a few months / weeks / years.
If I try and slog away at the same thing for months and years, it can get very tiring and boring, and I lose all the enthusiasm for the project. Working on other things helps rotate through and refresh my brain. I think of it like crop rotation; switching projects helps revitalise the soil of my mind.
When I finally come back to whatever project it was, I’m looking at it with fresh eyes. I can more clearly see the problems. Hopefully I’ve learned something in the intervening time that will help with the project, too.
Admittedly, there’s a bit of lag as I have to re-familiarise myself with how everything works. This might take a day or two for a complex project, or just a few hours, or even a few minutes.
For me, that timesink is worth it though, as the project is usually much more fun and exciting to work on that it was when I left it, and thus my efficiency magically increases, and my procrastination disappears.
As they say, Rome wasn’t built in a day. Why should it matter if I build a side project over the course of a few years?