On the unit sphere $S^{n-1}=\{x\in \mathbb{R}^n \colon x^T x=1\}$, $q^T p$ varies only between $-1$ and 1, so the densitiy $f$ does not vary too much. So it would be simple to implement rejection sampling. Then we must start with samling a point uniformly on the sphere, that is easy. Just draw $X$ from a spherical multivariate normal distribution (that is with mean zero and unit covariance matrix), and scale to norm 1. See How to generate uniformly distributed points on the surface of the 3-d unit sphere?
Then the rejection phase: Rescale the density $f$ so that its maximum value is 1, that is:
$$ f(q)= \exp(p^T q-1) $$ and use that for the rejection phase, resulting in the algorithm:
Draw $X \sim \mathcal{N}_n(0,I)$.
Draw $P \sim \mathcal{U}(0,1)$.
Accept $X$ if $P \le \exp(p^T X-1)$ else reject.
This is simple and maybe fast enough? If not fast enough, tell us.