This seems like a common question, glad you'd asked it.
I think there's no universal approach to solve all the problems. But when it comes to real-world applications, I stick to the following two approaches:
Choose the right toolkit for the job. If there'll be many data manipulations, it's better to stick to lisps (Clojure or something like that) and stored SQL-queries. Then just create some broad architectural convention, for pretty much any web application MVC would fit, and just use your toolkit. This is "microarchitecture" kind of approach. Microarchitecture tends to be vulnerable to code smells here and there if your toolkit lacks the expressive power, and I prefer to solve it with rich data-manipulation tool palette such as Lisps. The downside here is that you're tied to the specific language and have very small tool options.
Create a declarative DSL. Write an interpreter for it. Languages and tools don't matter anymore, but the whole thing obviously takes more time. Requires experience, I never did one without at least one failed prototype and rewriting the whole thing. It pays off tho – there's nothing that can beat maintainability and fault-tolerance of good DSL.
Thank you for taking the time to answer :)
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.