Я склонен использовать упорядоченные списки
<fieldset>
<ol>
<li>
<label for="txtNameFirst">Name</label>
<input type="text" id="txtNameFirst" />
</li>
<li>
<label for="txtNameLast">Name</label>
<input type="text" id="txtNameLast" />
</li>
</ol>
</fieldset>
Мое семантическое обоснование использования упорядоченных списков заключается в том, что многие печатные формы фактически пронумерованы и, следовательно, представляют собой упорядоченный список входных данных форм.
Семантически, я думаю, что список определений также содержит воду, и он имеет дополнительное преимущество - предоставляет обертку для каждой пары метка / вход, а также для каждой отдельной метки и ввода, что может дать вам большой контроль над дизайном ( если вы можете жить с легким упрямством наложения DL вокруг каждой пары метка / вход)
<fieldset>
<dl>
<dt><label for="txtNameFirst">Name</label></dt>
<dd><input type="text" id="txtNameFirst" /></dd>
</dl>
<dl>
<dt><label for="txtNameLast">Name</label></dt>
<dd><input type="text" id="txtNameLast" /></dd>
</dl>
</fieldset>
Если упорядоченные / неупорядоченные списки / определения просто не ваша вещь, то я бы пошел с div. Их единственная подразумеваемая семантика - «разделение», поэтому они подходят для работы.
Мне трудно оправдать использование элементов параграфа (p) для переноса пар метка / вход, поскольку подразумеваемая семантика элемента p просто не применима, на мой взгляд. (также было бы неплохо оставить элемент p доступным для использования внутри формы для пояснительного текста при необходимости)