Yes, you can do it that way, and many people do. It makes the templates really, really ugly. If there is a clean solution to this, I haven't seen it yet. Ironically, some of the cleanest ones I've seen involve creating the HTML on the Perl side (though usually with a backend module doing the actual HTML generation).
---- send money to your kernel via the boot loader.. This and more wisdom available from Markov Hardburn.
Depends on how you do it. Myself, I use Template Toolkit and right off the bat I created a widgets/ directory in my base template directory. This widgets directory contains a different template for each of the form fields (text inputs, textareas, radio buttons, select fields, etc). My select field template is exactly what is below. I'm not even sure now if the SET option.selected = '' line is needed. I think I had to add it because of some weird complication (perhaps the option.selected value wasn't being reset in each iteration of the loop?).
[% USE HTML %]
[% DEFAULT size = 1 %]
<select name="[% HTML.escape(name) %]" size="[% size %]" class="frmSel
[% FOREACH option = options %]
SET option.selected = '';
SET option.selected = ' selected="selected"' IF option.value =
DEFAULT option.label = option.value;
<option value="[% HTML.escape(option.value) %]"[% option.selected
+%]>[% HTML.escape(option.label) %]</option>
[% END %]