All of them render html at the server side, the browser only sees the html. Browsers have different rendering engines, so that same html might look different in different browsers.
Your server can also write JSON directly to the browser and add a header to instruct the browser to read it as json or write a zip file directly to the browser and instruct the browser to read it as a zip file and download it, etc
To get a better understanding, run this in your command line telnet towel.blinkenlights.nl - the browser does exactly this, it opens a socket connection to your server on port 80 if it's http and port 443 if it's https and your server writes data back to the browser in a format it can understand, just like this telnet command opens a connection and the server responds in a format that the terminal can understand. Whatever you write your website in, PHP, ASP, JSP, etc, it's all the same - browser connects to port on server, server responds by writing HTML into the open connection.
Also try this:
Type: telnet google.com 80 and hit enter, once you get feedback, type GET and hit enter. You'll now see telnet connecting to google.com on port 80 and returning data in exactly the way the browser will see it (the 302 in this case means a permanent redirect and the Location header tells the browser where to redirect to).
telnet google.com 80
Trying 216.58.223.46...
Connected to google.com.
Escape character is '^]'.
GET
HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: google.co.za
Content-Length: 261
Date: Sun, 14 Aug 2016 07:38:18 GMT
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="google.co.za">here</A>.
</BODY></HTML>
Connection closed by foreign host.
Jan Vladimir Mostert
Idea Incubator