I've shipped production systems with both a traditional MERN stack (MongoDB, Express, React, Node) and with Next.js as a full-stack framework. After two years of real projects, here's my honest take.
The MERN stack gives you explicit control. Your API lives in Express, your frontend is a separate React app, and the boundary between them is a well-defined HTTP contract. This separation is valuable when teams are large enough to own each side independently, or when your API needs to serve multiple clients (web, mobile, third-party).
Next.js full-stack collapses that separation — productively. API routes live alongside pages. Server-side data fetching via getServerSideProps or the newer server components eliminates client-side data-fetching boilerplate for most cases. For a small team shipping fast, this density is a superpower.
Where MERN wins: long-lived APIs that serve multiple consumers, teams with clear frontend/backend ownership boundaries, and situations where you need full control over the Express middleware stack.
Where Next.js wins: solo developers or small teams, content-driven applications, projects where SEO matters from day one, and anything that benefits from the Vercel deployment ecosystem.
The comparison most articles miss: operational complexity. A MERN app means running and maintaining two services. A Next.js full-stack app is one deployment. At the scale most projects actually operate at, this difference matters more than any framework-level performance benchmark.
My current default is Next.js for new projects. I reach for a separate API when the project explicitly requires it.