I don’t think that you need to compute any angles or (explicitly) normalize vectors to solve this, although you do end up computing a vector length or two. My approach to this problem seems similar to yours: First, find the orthogonal projection of the vector $C-D$ onto a plane that’s perpendicular to the cylinder’s axis. Once you have this projection, find the scale factor that changes its length to $r$ (the cylinder’s radius) and multiply $C-D$ by this same factor.
The orthogonal projection of a vector onto the perpendicular plane is the same as its orthogonal rejection from the axis, so letting $A$ be one of the end points of the cylinder axis, this would be $$\mathbf v=(C-D)-{(C-D)\cdot(A-D)\over(A-D)\cdot(A-D)}(A-D).$$ The required scale factor is $\frac r{\|\mathbf v\|}$, so the potential intersection point is $$P=D+\frac r{\|\mathbf v\|}(C-D).\tag{1}$$ (I write “potential” here because you’d still need to verify that this point is actually on the cylinder, although if both $C$ and $D$ are “between” the end caps, this is guaranteed.)
Observe that we don’t really need $\mathbf v$ itself, but only its length. We know that $\|\mathbf v\|=\|C-D\|\sin\theta$, where $\theta$ is the angle that $C-D$ makes with the cylinder’s axis. This suggests using a cross product since $$\|(C-D)\times(A-D)\|=\|C-D\|\|A-D\|\sin\theta,$$ so $$\|\mathbf v\|={\|(C-D)\times(A-D)\|\over\|A-D\|}.$$ Substituting this into (1) gives $$P=D+r{\|A-D\|\over\|(C-D)\times(A-D)\|}(C-D)\tag{2}$$ as an alternative formula for the intersection point.
I don’t know if that’s any simpler or more efficient than your approach, but it does avoid using trigonometric functions and their inverses, and requires at most the same number of square roots as computing two unit vectors.