I mostly agree with Gibson's analysis. But I think the portability issue carries much more weight than the "computer mics and speakers can't handle ultrasonic frequencies" argument.
Sure, the frequency response of electromechanical transducers designed for audio frequencies will fall off once you get beyond the audible range, but it doesn't instantly go to zero. For purposes of transmitting data surreptitiously you don't have to be that far outside audio frequencies; you just need to be far enough that most people are unlikely to hear it. And even if someone does hear it, they'll probably assume it is just inductor whine or a dying fan.
Mic inputs on most sound cards have a "gain boost" feature that could be used to bring the signal up to usable levels; e.g. the Realtek ALC892 has a switchable 0/10/20/30 dB preamp on the mic input. If you don't understand how decibels work, 30 dB of gain is a *lot* -- it is a factor of 1000! Bump your sampling rate to 96 kHz (or more), enable the 30 dB boost, and I think you could easily get a usable signal at (say) 30 kHz even with cheap computer speakers and mic. This is assuming, of course, that your onboard audio's ADCs don't have a fixed "brick wall" analog filter at 20 kHz to prevent Nyquist aliasing at the default 44.1 kHz sample rate... but hey, I've heard that a lot of motherboards skip the input filtering entirely to save cost; that would actually work to our advantage in this case!
Edit:
Captain Ned wrote:The "proof" article was using frequencies between 16Khz and 20Khz on consumer-grade boxen. Data rate was slow, but not zero.
At 16 kHz many people would still be able to hear it. I used to be able to hear the ~16 kHz "flyback whine" of CRT-based TVs (not any more though). But 16 kHz would also be well within the working frequency range of many computer mics, so you could probably transmit at a fairly low level, making it less noticeable. With decent DSP algorithms data rates in the low 1000s of bps are not at all far-feched.