The right way to implement a redirect is to write your code so that conditional logic is processed and HTTP headers are sent BEFORE any HTML is output, and not after. If you are sending output before determining whether the user should see it, then there is a fundamental flaw in your program flow.
ASP's response.redirect doesn't do anything magical; it does EXACTLY the same thing as the PHP header() function. It sends a "Location:" header instructing the client to perform a new request. In order to process that instruction, the client must receive that header before it gets any HTML.
Regardless of what programming language you use, you can't transmit headers after content. Headers, by definition, must be transmitted at the top of an HTTP response.
ASP may be buffering and reorganizing the data before it is output, which may allow the programmer to get away with writing sloppy code, but sloppy is still sloppy. PHP also can buffer the output; see the documentation for the PHP ob_start() function.