Можете объяснить, чем полезна буферизация?
Когда-то давным давно php не использовал буфер и отправлял клиенту всё сразу.
Примерно вот так вот<?php

for ($i = 1; $i <= 100; $i++) {
    echo $i;
    ob_flush();
    flush();

    usleep(300000);
}
ob_end_flush();
Сейчас буфер по умолчанию включён.
И выглядит это так. (Об это уже сказал Сергей Протько )<?php

$buffer = '';
for ($i = 1; $i <= 100; $i++) {
    $buffer .= $i;
    if (strlen($buffer) > 50) {
        echo $buffer;
        $buffer = '';
    }
}
echo $buffer;
Но помимо заголовков, о которых уже упомянули...
Буфер можно контролировать.
Например. В подключаемом шаблоне у нас ошибка.
Без буфера, пых с радостью отдаст её клиенту и сдохнет на пол-пути.
С буфером мы сможем её "игнорировать" или вообще поменять содержимое.
В итоге на странице, где у нас меню, будет красоваться не "PHP Notice....",
а человеческий текст "Произошла ошибка" или вообще пустое место.<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

$buffer = '';

function handler($ouputBuffer) {
    global $buffer;
    $buffer = $ouputBuffer;
}

ob_start('handler');
$ChuckNorris = 5 / 0;
ob_end_flush();

// Клиенту не полетит E_WARNING
echo "E_WARNING"; 

echo "<pre>";
var_dump($buffer);
echo "</pre>";
exit("File: " . __FILE__ . " Line: " . __LINE__);
В любом случае это полезная вещь и её надо хоть немного, да понимать.
конкретно в контексте шаблонизатора как в вашем примере - возможность пост-процессинга.
В целом буферизация вывода означает что в сокет данные будут писаться большими пачками, что бы не плодить маленькие пакеты. Это позволяет более эффективно работать с I/O.