Interesting... I do use a bit of minimal DOM manipulation via refs with React the only real gotcha is handling mount, update and unmount events. If the same component is on multiple screens during navigation, you need to handle update almost like mount, but account for already mounted events.
Examples: I'm client-rendering markdown into a react control, but want to handle routing to a /docs/* path in the application, so have a single event listener for click on the parent control to handle nested A elements. Similarly I have instances where some minor SVG and mouse events trigger behaviors that don't work well in react directly.
I find the few times I need to extend a React component to use direct DOM access isn't so bad, just have to account for a few lifecycle events. A lot of this came in the box, so to speak with jQuery which I've used as long as its' been around.
All of the above are of course better than the old west days of the v4 browser wars.