isinstance is supported but its result is static. It is useful for Modules that have different attribute types passed in, e.g.
class M(torch.nn.Module):
    def __init__(self, x):
        super().__init__()
        self.x = x

    def forward(self):
        if isinstance(self.x, List[str]):
            return self.x[2]
        else:
            return self.x + 2

print(torch.jit.script(M(['bye'])).graph)
print(torch.jit.script(M(2)).graph)

The compiler is able to see the isinstance check and evaluate it at compile time and remove the unused branch. The graphs show this:
graph(%self : ClassType<M>):
  %3 : str = prim::Constant[value="hi"]() # ../test.py:22:19
  return (%3)

graph(%self : ClassType<M>):
  %4 : int = prim::Constant[value=2]() # ../test.py:24:28
  %3 : int = prim::GetAttr[name="x"](%self)
  %5 : int = aten::add(%3, %4) # ../test.py:24:19
  return (%5)