That I believe is a GUI they render on the screen which tracks the approximate location of the bullet. You can use the functions of Camera such as WorldToViewportPoint to find which screen coordinates to use.
What they do, is they render a model every frame that has the same position as the camera. An even better way to do this, is to have a base viewmodel the arms, then have a gun model you weld to it, then animate the whole model, making it look like the gun is being held by the arms.
We know this because the original 2015 phantom forces source code has been leaked, and we can see that it uses viewmodels.
Rendering them on a viewport frame would work, but it’s more complicated that rendering some arms in the camera’s position on the client.
EDIT: I just checked, and Phantom Forces uses only viewmodels, no viewportframes or anything else. Viewmodels are the most common and easy way to get FPS arms rendering on the screen. Using GUIs not only achieves the exact same effect, but it achieves it in a much more complicated method, so I recommend to not use them. I have a good amount of experience with viewmodels, most issues that you think they have, are pretty easy to fix.
EDIT 2: They use two arms to achieve the affect, no animations, which makes development a lot easier:
They make the hand’s position lock onto a specific part of the gun, no animations, no GUIs, just some math. This is probably the best and easiest way to do viewmodels, so OP (@ExoticProto) should probably use it.