Варианты 1 и 2 на мой взгляд равнозначны, хотя в редакторах с подсветкой синтаксиса вариант 1 будет выглядеть лучше. На мой взгляд код на php - программа, а не html с активными вставками, да и выглядит куча вставок <?= ?> не очень красиво. Поэтому я предпочитаю вариант 2, только записывая немного по другому.
<?php
echo '<table><tr><td>ид</td><td>имя</td></tr>';
foreach($data as $user)
echo "<tr><td>{$user['id']}</td><td>{$user['name'] }</td></tr>";
echo '</table>';
?>
Вариант 3 стоит использовать если заранее сложно определить, надо ли выводить блок, например
<?php
$content = '';
foreach($data as $user)
if ($user[name] == 'Вася')
$content .= "<tr><td>{$user['id']}</td><td>{$user['name']}</td></tr>";
if ($content !== '')
echo "<table><tr><td>ид</td><td>имя</td></tr>{$content}</table>";
?>