Complexity of finding a perfect matching in directed graphs
You can find the maximum matching in all three cases in polynomial time.  It follows that it's possible to check whether there exists a perfect matching and, if so, to find one.

Finding a maximum matching in an undirected graph can be done in polynomial time.  It is not known (or likely) to be NP-hard.  See https://en.wikipedia.org/wiki/Matching_(graph_theory)#Algorithms_and_computational_complexity.

If you define the problem according to option 1, then finding a maximum matching in an undirected graph $G$ is equivalent to finding a perfect matching in the corresponding undirected graph (where you just ignore the edge directions) -- and thus can also be done in polynomial time.

If you use option 2, then the following algorithm can be used to find a maximum matching in polynomial time:


Given a directed graph $G=(V,E)$, construct a weighted undirected graph $G'=(V,E')$ with edge set defined as follows:


If $G$ has an edge $v \to w$ but not its reverse $w \to v$, add $(v,w)$ to $E'$ with weight 1.
If $G$ has an edge $v \to w$ and also its reverse $w \to v$, add $(v,w)$ to $E'$ with weight 2.

Find the maximum-weight matching in $G'$, i.e., the matching whose weight is maximized.
Now turn this into a set of edges in the original directed graph.  If this process selected an edge $(v,w)$ and $G$ contains both $v\to w$ and $w\to v$, add both to the matching in $G$.  If it selected an edge $(v,w)$ and $G$ contains only one of $v \to w$, $w\to v$ but not the other, add the one you can.


This runs in polynomial time and finds the maximum matching in $G$.

A simpler way to check whether $G$ has a perfect matching (i.e., one that covers all the vertices) is to construct the undirected graph $G'$ (you can ignore the weights) and check whether $G'$ has a perfect matching.