Sorry this is a little late, since it seems you’ve already found a solution. But for your awareness, I wanted to point you to the following thread, which seems like it might accomplish what you’re looking for in a way that uses more FEniCS and less numpy: Obtain velocity normal to boundary - #2 by dokken
Regarding the first of your questions below, it does make sense to have multiple DOFs sharing the same coordinate. Since you mentioned elasticity, I assume your dependent variable is displacement (a vector). Thus for a given vertex (i), you will have three displacement components u_x^{(i)}, u_y^{(i)}, u_z^{(i)} at each mesh vertex, and thus three DOFs which all share the same coordinate.
Regarding your second and third questions, unfortunately, I don’t have an answer.