You need to use runat="server" for any control that needs to be parsed as a server control.
Any element with runat="server" will be analyzed in the server control in the page archiarity. Everything else will be processed as plain text and placed in the LiteralControl in the page hierarchy.
The exception is elements that are not real elements, but special tags in another server tag, such as ContentTemplate tags. They do not need runat="server" because the containing control will parse them.
Guffa source share