If you want to remove all line breaks, then you should replace with the empty string. The thing is that you'll get only one long line. In your expected, result you want something like this:
<!DOCTYPE html>\n
<html>\n
<head>
So what you want to do is actually turn all repeated line breaks into a maximum of one. I guess something like this should get you your expected result:
$html = "<!DOCTYPE html>
<html>
<!--xyz blah-->Something else
<!--xyz
blah-->Again...
<head>";
$searchs = array(
'/<!--.*?-->/s',
'/\t/',
'/[\r\n]+/',
);
$replaces = array(
'',
'',
"\n",
);
echo preg_replace($searchs, $replaces, $html);
A better approach would be to use already existing libraries: https://github.com/mrclay/minify/blob/master/min/lib/Minify/HTML.php
Having said so, there are something this is leaving apart. For example, if the HTML loos like this "word\tword" you would see something this in the browser "word word". However, if you remove the tabs, you'll see something like this "wordword". The same happens with the line brakes so it would make more sense to use a multiple match on the tabs too an leave only one.
Also note you're trying to parse HTML with a regular expression. Regular expressions don't understand the hierarchical data of HTML so having comments inside the comments would again break things. Better to user an HTML parser (which will, obviously, degrade performance).
Finally, take into account you are not considering <pre> tags. This will absolutely destroy their content so, again, you need an HTML parser to avoid them.
Conclusion: try the library. If it doesn't do the trick, better not to touch the HTML. If it does the trick, then measure the time it consumes to make sure it really ends up being faster. Don't leave aside enabling gzip HTML compression as it might be all it is actually needed and you don't have to worry at all about the compression as it would be happening in a different layer.