Next.js lets you build a complete web application: routing, image optimization, server or client rendering. Roughly, a backend for the API and a React frontend in the same project.
But I find the Next.js backend gets less practical as the application grows. Guards, for instance, end up repeated in every route. The Next.js middleware solves that, except it only allows one. Put every guard in the application into a single middleware and the code becomes hard to read.
Server Components add another layer of complexity. Instead of thinking only about how to split components up, you have to decide whether each one renders on the server or on the client.
That said, I go with Next.js for sites that need SEO, or apps with little server interaction. A Server Action is handier for a simple contact form than building an API.