I think I have figured out the answer. The pixels in the TF2 ui are not native resolution pixels. When I added a hud element that is 100 px in size, it shows up on my screen as 250 native pixels. So the ui elements are drawn in the abstract pixels (approx 640 x 480 grid) and then scaled up to the games actual resolution. Because the scale factor for my resolution (1920x1200) is 2.5, the scaled up image does not line up with native pixels. This means that is impossible to create pixel accurate ui elements like crosshairs.
This is obvious when making a hud crosshair. There the size is specified exactly in TF2 pixels. When adding a crosshair using the multiplayer options, the scaling from TF2 pixels to native pixels is hidden from the user.
Edit: On second thought, this does not explain why the multiplayer options crosshair is still blurred even on 640x480 game resolution. The crosshair added through multiplayer options is still blurry on 640x480 resolution, but the crosshair added as a hud element is pixel perfect. So hud elements are scaled only once, up from TF2 pixels. multiplayer option crosshairs must be getting scaled multiple times. weird