Software *can* be undeterministic, but software that emulates a clocked hardware circuit, as in an FPGA, has no reason to be. You have global variables, many of which can be in registers on something like RV32I with 1024 bits of registers, and the rest in equally deterministic SRAM. There is no reason to use interrupts, or if/then/else, or any loops other than the one master loop that corresponds to the FPGA's clock. On a simple in-order CPU the instructions will execute at one per clock cycle.
It will be "hard real time".
It will quite likely be slower than an FPGA. But you easily prove how much slower, and it will always be the same speed, and it might well be fast enough. As Peter-H said, in that avionics application an update rate of 30kHz is probably more than fast enough. That's 1500 instructions on a 10c 48 MHz CH32V003. That's a heck of a lot of TTL emulated. And you could get a 72MHz, 144MHz, 300MHz, 600MHz, 1GHz microcontroller instead if you want.