First:
Any PCB program that can work with netlist files in readable ascii can be made to work this way.
So eagle probably too. (Long time ago I needed a new PCB program, did not like Eagles library structure and decided on KiCad myself).
I think back-annotation is overrated. It's a very small portion of the whole PCB design in the fist place, and using the normal workflow of updating the schematic (euhm netlist) and re-reading it with the PCB program again is just as easy.
KiCad also has a lot of side-projects that sprung up around it. One of them (there are 60+) is SKiDL.
SKiDL is a python library that helps with creating a KiCad compatible netlist directly from python.
For example, you start with declaring a capacitor and fill in some values such as the capacitor value itself and a footprint link.
Then you define some nets and give them names.
If you then decide you need a lot of decoupling capacitors, you can write a simple for loop, and easily create as many of those capacitors.
And at the end you call a library function to output the netlist.
When I was looking into SKiDL, I got the Idea it was a sort of VHDL for PCB connections, and I think that is also the way it started.
When you see schematics with big FPGA's, then you may recognize it does not make much sense to make a traditional sort of schematic for it.
It's just rows and rows of breakout pins that go to labels, that disappear onto some other page.
And, of course, the SKiDL project is an open source project, and because it's python it's quite easily readable and modifiable.
It should not be too difficult to add an option to output a (text based) netlist in a format that can be read by another program (such as eagle).