I've built the same project many times - when I was in construction building houses. Even when we got a new blueprint it was mostly similar to existing houses and so we could estimate it well - but we always added a little padding to the new print because there were things we would find on the job that we didn't expect. When the print was one we had never built but someone else had we had more confidence in our estimates.
Software though - why would you start over from scratch? That is maybe once every 30 years.
There are a ton of small (software) projects I've started from scratch even though they "look like" the same from afar. The small differences matter. An ex coworker of mine had a saying:
If it "looks like an alligator, except..." then it's not an alligator.
I can't count how many times I got burned, tried to beat previous code into submission to fit the new thing, only to realise I'd have an easier time just doing it bespoke from scratch so that it has 100% fitness for purpose.
That, or you start writing reusable frameworks, which you have to somehow design and maintain, and "the project" becomes the framework itself instead of what you set out to originally do. How many have developed game engines instead of the game they set out to write? or blog generators instead of doing actual blogging they set out to do?
Reusability can be a beautiful trap. I'm done with that, now I just do the damn thing.
Software though - why would you start over from scratch? That is maybe once every 30 years.