Thanks for the references. The academic paper about Hyperscan is very interesting:
https://www.usenix.org/system/files/nsdi19-wang-xiang.pdfMy impression is that they break the regex into components and use choose different algorithms for each component:
1. String search (for fixed strings)
2. DFA (if the number of states is small enough)
3. NFA (if the numer of states is too large)
But one important detail is that Hyperscan doesn't do capture groups and IIRC, capture groups are hard to do using a DFA representation. So going back to my original question, I now wonder if there are other ways to run an NFA (for regexes with capture groups) other than the traditional method of updating all the states in parallel, one character at a time.