When you create an ASP.Net MVC View(Page) it inherits from a class, as you said called ViewPage - which in return inherits from the Page class from ASP.Net WebForms (System.Web.UI.Page) and implements the IViewDataContainer interface (from MVC).
The Page class implements the IHttpHandler interface which IIS "talks" to.
All in all the IHttpHandler has a method called ProcessRequest which takes in a HttpContext instance.
A whole lot of magic happens around here (ok, it's not magic, but you get the idea) - the class is new'd up (your ViewPage) and it has several methods that gets invoked - some hook up the master pages and so forth and one of them will somehow read the .aspx page and have all normal output being wrapped in calls to Response.Write and the rest will be run as C# code (and <%= ... %> will be turned into Response.Write calls too) - and I do believe this parsing is done through Regular Expressions.
Please note, I am not expert on this and most likely technically wrong (and hey, someone feel free to post a better response to this, I tried to give the general understanding) but it should give the overall and general understanding of this.
EDIT: Also may I add that when you return a ViewResult through your Controller class it will eventually have a method invoked (I believe it is called Execute) that comes from the ActionResult class that it inherits from, which will then start a process of picking the right ViewEngine, the default one being the WebForms one, which then calls into the entire process stated above all this big gigantic edit mess.
@Hermant's comment
As I said, if you take out the master pages stuff you need to think of the entire .aspx page being a method where all the stuff that is not wrapped in <% and %> to be C# code that looks like:
Response.Write("<html> ... <head> ...");
Every once in a while you have your <% ... %> calls which executes in between all these Response.Write calls.
Which say take the following .aspx
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<html>
<head>
<title><%= MyMethodCallToFindTitle() %></title>
</head>
<body>
<ul>
<% for(int i = 0; i < 10; i++){ %>
<li><%= i %></li>
<% } %>
</ul>
</body>
</html>
It will somewhat be translated into a method looking "somewhat" like this:
Response.Write(@"<html>
<head>
<title>");
Response.Write(MyMethodCallToFindTitle());
Response.Write(@"</title>
</head>
<body>
<ul>");
for(int i = 0; i < 10; i++){
Response.Write(@"<li>");
Response.Write(i);
Response.Write(@"</li>");
}
Response.Write(@"</ul>
</body>
</html>");
Note: of course there's a whole lot of stuff going on in case you had " hanging around in your HTML, along with newlines, tab-indentation and so forth, but this is the general overview.
I hope this helps.