+`(.).?\1 $1 1`ba|cb|ac -$& \w(...)*.* $#1
Try it online!
I knew something like this should be possible and competitive--it just didn't occur to me that it would be in Retina!
Explanation:
+`(.).?\1 $1
Match any character, zero or one other characters, and a copy of that first character. Replace all of that with just the first character, and repeat until nothing changes.
Each iteration essentially "straightens out" every pair of steps that undo each other on top of gradually condensing runs of the same vertex, and repeating this eventually leaves only steps which are all in one direction or the other.
1`ba|cb|ac -$&
Match the first occurrence of a counterclockwise pair and prepend a minus to it. Due to the previous step, if there's a counterclockwise pair anywhere in the string there has to be one at the very beginning, and this is sufficient to determine the sign of the result (unless it's 0, which can also be output with a leading minus--I assume this is fine).
\w(...)*.* $#1
Match the first letter (i.e. after the sign if present), and replace that and everything after it with the length of everything strictly after it floor divided by 3. Since every step is in the same direction now, every three steps completes a full revolution, so the number of thirds-of-revolutions is just the number of steps which is 1 less than the number of letters.
(.)\1* $1$1 ba|cb|ac|$ -- O`. +`-\w ^(((-)|.){6})*.* $3$#1
Try it online!
...I was going to suggest this as a golf to Neil's Retina 0.8.2 solution, given that that is what it started as, until I realized I'd made some or another meaningful change on all but two lines (now one). Funny how that happens.
Explanation:
(.)\1* $1$1
Replace every run of identical characters (including trivial runs of a single unique character) with precisely two copies of that character. This results in non-overlapping pairs corresponding to every overlapping pair in the original input, with an extra character at the beginning and end.
ba|cb|ac|$ --
Replace every counterclockwise pair, and the empty match at the end of the string, with two minuses. Each counterclockwise pair needs to contribute two minuses since each clockwise pair contributes two letters, and the extra two at the end balance out the leading and trailing unpaired letters.
O`. +`-\w
Sort that result, so that minuses precede letters, then delete minus-letter pairs iteratively until none remain. Sorting is 1 byte shorter than matching unequal pairs in both orders and repeating \w.
^(((-)|.){6})*.* $3$#1
Divide by 6 rounded towards 0, and convert to decimal:
Like Neil's paired division and conversion, this doesn't directly "do signed math" so much as it floor divides the nonnegative unary and copies the unary digit onto the beginning of the decimal result to serve as its sign. However, using a number-of-matches substitution $#{...} instead of a length substitution $.{...}, it's a little trickier to actually match specifically a minus sign without consuming it out of the total--I have to clumsily use ((-)|.) to include it, since filtering letters out afterwards is much bulkier (because decimal digits are also matched by \w),
Outside of the sign logic, this matches the entire string as 0 or more greedy repetitions of 6 of anything then 0 or more repetitions of anything at all (anchored to the start of the string to eliminate an extra empty match at the end), and replaces it with (the sign prefixed to) the number of times the 6-wide group matched in decimal.
a? \$\endgroup\$acbto assure flooring towards0rather than towards-inf. \$\endgroup\$