This can lead your complexity from branching logic to regular expression logic:
/(?<special>(?<feet>\d+)(?<inch>\d{2})(?<sixt>\d{2}))|((?<feet>[\d.]+)')?[\s-]*((?<inch>\d+)?[\s-]*((?<numer>\d+)\/(?<denom>\d+))?")?/
If group special matches, you have special syntax, and the output is legs * 12 + inch + _sixt_ / 16, using ToDecimal for groups. If not, you will have one or more groups of feet, inches, numbers and denominations if the entry is valid. Use ToDouble for legs and ToDecimal for the rest, and be sure to check the division by zero in the fraction.
Evidence-Based Demo Code (ruby):
[ ["12.5' "," 12 Feet and six inches "," 150.0"], ["11\" "," 11 Inches "," 11.0"], ["3/16\" "," 3 sixteenths of an Inch "," 0.1875"], ["11' 11\" "," 11 Feet and 11 Inches "," 143.0"], ["11'11\" "," 11 Feet and 11 Inches "," 143.0"], ["12'-11\" "," 12 Feet and 11 Inches "," 155.0"], ["12' 11 3/16\" "," 12 Feet and 11 Inches and 3 sixteenths "," 155.1875"], ["12' 11-1/2\" "," 12 Feet and 11 Inches and 8 sixteenths "," 155.5"], ["12' 11 1/2\" "," 12 Feet and 11 Inches and 8 sixteenths "," 155.5"], ["121103 "," 12 Feet and 11 Inches and 3 sixteenths "," 155.1875"], ["", "empty string", "0"], ].each{|i,d,o| m = /(?<special>(?<feet>\d+)(?<inch>\d{2})(?<sixt>\d{2}))|((?<feet>[\d.]+)')?[\s-]*((?<inch>\d+)?[\s-]*((?<numer>\d+)\/(?<denom>\d+))?")?/.match(i)
exit:
12.5' 150.0 150.0 11" 11.0 11.0 3/16" 0.1875 0.1875 11' 11" 143.0 143.0 11'11" 143.0 143.0 12'-11" 155.0 155.0 12' 11 3/16" 155.1875 155.1875 12' 11-1/2" 155.5 155.5 12' 11 1/2" 155.5 155.5 121103 155.1875 155.1875 0 0.0
Please note that I made no effort to test other inputs than the ones you provided. You may want to, for example, check non-zero values, at least in some capture groups, or perhaps perform the test as a separate step. This code was parsed.