Very balanced take.
Also to trade off 1 - RSC also incurs a network latency penalty for interactions on the server handled parts. Interestingly not many people talk about this.
Here's how to better understand RSCs:
RSCs are two sets of tradeoff, a technical and an architectural. Yes "tradeoff", not "benefit". It might benefit your use case, but it might also be disadvantage.
1 - Pay for bundle size with payload size. By doing more work on the server, you can avoid having to send code to the client. But as a tradeoff you make each response payload bigger than it was. This might not matter if you had inefficient data patterns anyways, but atleast you had the capability to really optimize how much data is sent back and forth (see GraphQL). RSCs help you optimize for bundle size instead of payload size.
2 - Server-first vs client-first architecture. The way RSCs are intended to be used are with a server-first routing architecture (aka Next.js and Waku) rather than client first (aka Remix and Tanstack Start). You still have #1 with client first, but opting into server-first brings a whole set of tradeoffs of its own, like eliminating client-server waterfalls at the cost of granular refetching. You can get granular refetching with RSCs with a bit of work, and you can eliminate server waterfalls in a client-first architecture with a bit of work. But the architecture bakes that tradeoff fundamentally.
Any other advantage that people might tell you to sell RSCs like full-stack composition or client-server colocation are true, but they are not unique to RSCs. Server functions give you all of that, even in non-react frameworks, and don't force any tradeoffs like RSCs do. You might not need RSCs.