Being able to directly inject C# services into the razor components is one of the most productive transitions we experienced. All of our JSON APIs got sent to the trashcan and we now have way more time to focus on more important stuff. Also, little things like subscribing to CLR events from components really make you feel empowered to move mountains. Some of our Blazor dashboards have absolutely incredible UX and it took almost nothing to make it happen because of how close you can get the backend to the HTML. You definitely have to change how you think about certain problems, but once you find a few patterns for handling edge cases (e.g. large file download/upload), you are set forever.
Our custom blazor javascript interop source file is still under 200 lines of code. Every other bit of js is provided by the framework. I would say we certainly got the benefit we were going for wrt minimzing javascript source in the codebase.