I fail to understand how shuttling JSON back and forth is superior to sending the HTML fragment(s) that have changed.
JSON needs to be parsed and in 99% of scenarios, this blocks the main thread.
Once the JSON has been converted to a data structure and passed around through your SPA's state logic and template rendering, what do you do? You convert it to HTML and render it.
No matter how you slice it, sending HTML fragments and updating the DOM is faster and lighter than sending JSON. My app is already displayed and responsive before your app has even started parsing.
The above doesn't even address the complexity and additional failure modes that you take on when you have to handle edge cases and errors, all of which is quite literally reimplementing functionality that the browser and HTTP already give you.
SPA supremacy is a group delusion mind virus. Thank goodness the pendulum is finally swinging back.