You are right in that: multiplying your signals in the time domain corresponds to a convolution in the frequency domain. A pure complex exponential carrier is basically a peak (a Dirac delta) in the frequency domain. Convolving with that corresponds to a "shift" - which is how you modulate. So far so good.
However, you forgot that your signals are real-valued sinusoidals, which have a (Hermitian) symmetric spectrum. Your baseband signal in the frequency domain then consists of two peaks, one at $4\,\mathrm{kHz}$ and one at $-4\,\mathrm{kHz}$! (The same goes for your carrier actually, but this is not relevant in this case.) Both peaks are then shifted by $20\,\mathrm{kHz}$, so that you end up with $16\,\mathrm{kHz}$ as well as $24\,\mathrm{kHz}$.
Since you seem to be simulating this, and use a sample rate of $48\,\mathrm{kHz}$ across the board, you might run into sampling issues as explained in @hotpaw2 's answer, which is why you might only see the $16\,\mathrm{kHz}$ peak.