Flags such as [L] are not used with mod_alias, so that's your 500-class error. In addition, mod_alias can't consider the query string, and can't use Conditions. Finally, mod_alias works by reappending new material onto an existing path.
But you can ignore the entire preceding paragraph, because the short version is:
Do not use mod_alias (Redirect by that name) in any htaccess file that also contains RewriteRules. The server won't explode; you'll just get rules executing in the wrong order.
If you translate this
RedirectMatch 301 /otw-portfolio/(.*) /portfolio/$1
into mod_rewrite syntax, you get
RewriteRule otw-portfolio/(.*) /portfolio/$1 [R=301,L]
which should really be-- in any module--
RedirectMatch 301 /otw-portfolio/(.*) http://www.example.com/portfolio/$1
and
RewriteRule otw-portfolio/(.*) http://www.example.com/portfolio/$1 [R=301,L]
This, by itself, shouldn't create an infinite loop. The pattern looks for the element "otw-portfolio"; the target removes this element. No loop.
But you should use an anchor. Assuming the full URL in its original form was
www.example.com/otw-portfolio/more-stuff-here
a RewriteRule located in htaccess will normally say
RewriteRule ^otw-portfolio/more-stuff-here et cetera
It's probably easier if you cite the actual file and directory names in your questions. It is perfectly OK to do this, so long as the domain itself is called example.com.