The single qubit state is
$$|\psi \rangle = \alpha |0\rangle + \beta|1\rangle = \begin{pmatrix} \alpha \\ \beta \end{pmatrix} \hspace{2 cm} \alpha, \beta \in \mathbb{C}$$
and if you know what $\alpha$ and $\beta$ is ahead of time then of course you can keep track of all the matrix vector multiplications as applying a quantum gate is nothing but applying a unitary matrix, $U \in \mathbb{C}^2 \times \mathbb{C}^2 \ \ \ \textrm{s.t} \ \ \ U^\dagger U = I $, to the vector $|\psi \rangle$. So from the information of the resulting vector from the matrix-vector multiplcation, you can determine the probability of observing $|0\rangle$ and $|1\rangle$. This is what it is being done if you use something like statevector_simulator
fro Qiskit.
For a single qubit, this is not a problem... but when you start getting into the 50 qubits range... storing $2^{50}$ complex values is quite daunting already and we are not talking about the cost of matrix-vector multiplication yet. With all that being said, here I am assuming a general setting. There are cases where this exact simulation can be done efficiently classically.