but its accuracy is very low (real system is 3.5 seconds, estimation is 0.00002 seconds). So, are there other ways to estimate circuit runtime? I think this is very important because if I want to run a circuit on a real device (pay-as-you-go), I need to know how long my circuit will take before submitting the circuit.
You can try to use Qiskit pulse, see: https://qiskit.org/textbook/ch-quantum-hardware/calibrating-qubits-pulse.html#4.2-Measuring-$T_2$-using-Hahn-Echoes-
result.time_taken is the execution time. There is also
job.time_per_step() that gives you the timestamps of each step of the job's life cycle.
If you're looking to set some variable locally in your program, the best you can do is probably use job status.
job.wait_for_final_state() supports a callback function that you can use to set the variable when status changes.