So, although the client-side non-thin non-native apps (a.k.a. in-browser JS fat clients) are easy to write, nice and responsive, I'm sorely missing a way to do some of their heavy lifting server-side.
Your description of "magic band-aid at expense of performance" is IMNSHO unfair - before it became a huge golden hammer (and long before small replacements like Zepto), jQuery brought usable, cross-browser scripting, with features that the browsers themselves did not have (We're talking IE6 here, remember?). This allowed robust coding, and it was actually more optimized for common operations than a naïve "pure" JS implementation.
This is indeed becoming a problem of the past, precisely because browsers started to implement those features natively - but the choice of features was often driven by "oh, and jQuery does this, it would be nice if we didn't need a library for it".
If you'd like to implement some modern front-end technologies that lend themselves to this style, you could look to Vue.js (https://vuejs.org/) paired with a technology like Turbolinks or Turbograft (which allows for partial page refreshment).
It allows you to build something that feels more dynamic but still is based in Rails/ERB templates.
I've needed to build rich, complex UIs under a deadline, and React has made that way easier and more maintainable than if I'd done it the old way.
React hasn't been around long enough to make that claim. Angular 1.X has and, imho, it's no more maintainable than your typical jquery program. I suspect we'll find the same thing is true with react in another 3-5 years.
(Standard disclaimer about how you can write maintainable code in any framework and this isn't necessarily a rule.)
I'm sure it's totally possible to write unmaintainable rubbish in React, just as it is in any language/framework/library, but I found it much easier to write idiomatic, maintainable code than the wild west of jQuery.
Have you looked into not-JS languages that eventually produce browser-runnable code?
OP is questioning their soundness with not just an opinion but with an argued view.
Therefore, OP could get back other argued instances of agreement and disagreement, stimulating a constructive debate, which in turn could end up modifying paradigms and reassigning truth values.
And yeah, they could even get reassigned to OP's view.
Traditional web sites don't necessarily need JS (although it often makes them better), but web application most certainly need JS.
Even Brendan Eich apologizes for it.
Hopefully web assembly gives us options in the browser.
Mandatory mention: intercooler.js lets you add ajax to you app w/ very little javascript.
I really didn't like javascript and thought that AJAX should work like regular old web requests and, in the process, rediscovered REST/HATEOAS. I really like it. You can use whatever language you'd like on your backend, all the communication is in HTML, as Berners-Lee intended.
React et al is not for this kind of work. If you're doing things that add niceties to interactions or some basic form validation, then you do not need a framework like Angular. Use jQuery or similar. But if you need to, for example, write a very UI heavy and data intensive app, then you'll probably want to use an existing framework like React. Or you could spend 6 months or 3 years writing your own framework before getting any actual work done.
If you're building a more interactive app, for example, let's say Trello; Server rendered views enhanced by jquery is never going to work.
TypeScript also helps. I've been using it for just a few months, but it has already saved my ass many times.