on the web, querystring was still used for a while for load-balanced session IDs to scale out web servers better (before the session could be reliably pinned at layer 7 to one server).. it also became real nice on web apps when the hosting app (browser) could close out and reopen (within a certain timeframe) and the user not have to log in and find the last page they were at, as long as they're coming from the same IP and haven't changed app versions (or w/e your constraints are).
One aspect to mention is that we are paying for the compute of the "UI logic" when done server side , but client side counting with the compute power of the client is the way to go most of the time. Most of the reasons I heard are not strong enough to justify having to compute/pay server side.
Flutter and React Native are great options for building multiple apps. There are some tradeoffs though. Having native mobile apps is always the best option for flexibility and quality but that obviously means you're coding for multiple platforms separately. So it really depends what you need for your app. When I was at Netflix we had debated leveraging React Native to build out native signup flows for iOS and Android but we realized there were a lot of limitations going that route. Hopefully that helps. It feels like the answer is another "it depends" :)