Я не уверен, что именно вы подразумеваете под "каждая строка должна правильно совмещаться друг с другом". Если вы имеете в виду, что каждая метка должна быть правильно над входным элементом, это относительно просто, но требует вложенных элементов div:
<div class="field">
<div class="label"><label for="firstname">First Name</label></div>
<div class="control"><input id="firstname" name="firstname" type="text"></div>
</div>
Если вы думаете, что это слишком много слоев div, вы явно никогда не смотрели на источник движка блогов. :)
Затем вы можете расположить свои поля div любым удобным для вас способом.
Если, однако, вы имеете в виду, что элементы div на разных строках должны выстраиваться в линию, тогда это будет намного сложнее, если вы не установите ширину элементов div. Иногда это практично, иногда нет. Это только одна вещь, в которой таблицы лучше, чем «чистый» CSS.
Здесь есть риск саморекламы моя точка зрения на таблицы против чистого CSS . Я придерживаюсь прагматического взгляда: если то, что вы делаете, легко сделать в чистом CSS, сделайте это таким образом, но из-за ограничений в CSS и различий в браузерах есть некоторые эффекты, которые вы просто не сможете сделать (или делать хорошо) без использования таблиц.