but from all of the tutorials and material I've come across online I can't seem to find a way to to transmit data at frequencies around 80 kHz to the surface.
As said, you'd modulate your current or your voltage, from a controller.
I've been told that using VCO circuits to simply generate a low frequency signal
Well, a VCO is a voltage-controlled oscillator. It generates an oscillation, and you can control it with a voltage. That's what it does :)
and modulate it with an input signal would be unstable and unreliable so my understanding of FM radio has proved useless at this point.
Since your input signal would be discrete, we call that Frequency-shift keying, i.e. your data is put into discrete frequencies that you generate.
I did not say it would be unstable or unreliable. I said it would be less accurate than if you generated the oscillation digitally, which I stand by: all the VCO circuits you'll find are far less accurate in frequency than a quartz-derived numerically generated (that means calculated with a computer, e.g. a raspberry pi) oscillation. Less accuracy means "harder to detect" at the receiver, and that means more bit errors happen.
In the comment that you seem to be referring to, I said that your VCO doesn't solve your problem of transmitting data (you're far, far far away from transmitting "files").
A VCO is a method to generate a voltage-controlled oscillation. That's it.
You can modulate the oscillation frequency by changing the input voltage to the VCO; that's the purpose of a VCO.
With that, you can directly build a frequency-shift keying (FSK) transmitter that you feed with voltages generated by a microcontroller / your raspberry pi. I specifically confirmed you can do that with a VCO.
You can't generate any other modulation than FSK / FM with a VCO alone. There's many other modulations.
BUT: You have already have a raspberry pi in your system. Which can directly be used to generate a 80 kHz carrier. Your VCO is simply something you don't need to generate that carrier. It's really not a component that advances your system – you need your raspberry pi to emit a time-varying voltage to control the VCO. If you make your raspberry pi emit a time-varying voltage, that voltage might as well directly vary at 80 kHz, making your VCO redundant.
That's what I meant when I wrote:
Practically speaking, you don't need the VCO, it's just an unnecessary piece of analog hardware if you ask me: it restricts yourself to using frequency shift keying with pretty inaccurate frequencies and hence high error rates, and you still need something like a microcontroller to modulate the voltage for your VCO. That microcontroller can, however, pretty trivially also do the job of your VCO, just better. So, drop the VCO.
You can tell your raspberry pi to instruct a Digital-to-Analog-Converter (DAC) to generate your 80 kHz carrier with the modulation you want. That is pretty much SDR for your use case.
Think of your VCO as a string of a violin: You can control the frequency of the sound emitted by said string by pinching the string in the right position. You can control the frequency emitted by a VCO by setting a voltage.
Now, you can use different tones to communicate data. Say, frequency 79 kHz for the 0 bit, frequency 81 kHz for the 1 bit. Makes sense, right.
Now, your Raspberry pi has plenty of CPU power to synthesize the tones: Just like a digital music synthesizer has no problems generating different tones digitally without ever actually containing a VCO (or a violin), your Pi can just calculate the waveform you want, and give it to the DAC, which converts it to an analog voltage that follows the calculated waveform.
But if it can calculate the waveform you want, you're suddenly no longer constrained to abrupt transitions between tones; you could just as well use much nicer "alphabets" to communicate. In your earth scenario, that might realistically mean you want to send multiple tones at once (for example, 77, 79, 81 and 83 kHz at once for the 0 bit, and 78, 80, 82, and 84 kHz at once for the 1 bit). Your receiver listens for these multiple tones, and even if a single tone is well-absorbed by the electrical properties of your soil, the others might make it through.
You'll find that other subterranean communication systems might not use tones as signalling, but modulate other properties (amplitude, phase) of the carrier. Can't do that with a VCO at all, but trivially with your Pi without a VCO!