It is very tempting to put special ligatures or alternate glyphs onto rarely-used character positions in order to make them available, or to use private-use Unicode values for accessing small caps, for example. However, although it would look fine in the browser, this would make the text “unreadable” for robots, it would give you flawed plain text when copying from a Web site, and display incorrectly where Webfonts are not supported.
So keeping the underlying text strictly semantic is the key virtue, and for that it looks like we will have to use separate fonts, at least under the hood. The devil will be in the details, however. Are small caps semantically to be treated as lower case? What if someone prefers to use them without a capital letter at the beginning? Should this be treated as semantically all-caps, or should only the first letter be encoded as upper case?
I have been using capital letters with fake-small-caps sizing until such time as legitimate small caps become usable, when two lines of CSS will enable such use.