CLN: use cimports for type checks
The generated C corresponding to the cnp.integer check in is_integer_object is `__Pyx_TypeCheck(__pyx_v_obj, __pyx_ptype_5numpy_integer)` which looks to me like it goes through python-space paths, can you comment @WillAyd ?

Despite that, perf seems neutral-to-improved:

```
import numpy as np
from pandas._libs.lib import is_integer

item1 = 2
item2 = np.int64(1)
item3 = "foo"

%timeit is_integer(item1)
63.6 ns ± 1.17 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)  # <- main
62.9 ns ± 0.992 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)  # <- PR

%timeit is_integer(item2)
70.5 ns ± 2.78 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)  # <- main
68.9 ns ± 1.37 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)  # <- PR

%timeit is_integer(item3)
64.7 ns ± 2.95 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)  # <- main
61.6 ns ± 0.469 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)  # <- PR
```

Also for @WillAyd: we could make similar simplifications in util.is_float_object and util.is_complex_object but that would require removing their `nogil`ness.  IIRC that was something you thought we should do regardless?
> `__Pyx_TypeCheck(__pyx_v_obj, __pyx_ptype_5numpy_integer)` which looks to me like it goes through python-space paths, can you comment @WillAyd ?

Not sure - would have to see how Pyx_Type_Check is implemented. I suppose it could just use C-level struct access, but likely defers to `PyObject_IsInstance` at some point

This PR looks great. I am of the opinion that `nogil` is not worth jumping through hoops for if we cannot measure an improvement with it Thanks @jbrockmendel 