Why does CNN forward pass take longer compared to MLP forward pass?
From the NumPy Linear algebra documentation:

The NumPy linear algebra functions rely on BLAS and LAPACK to provide
efficient low level implementations of standard linear algebra
algorithms. Those libraries may be provided by NumPy itself using C
versions of a subset of their reference implementations but, when
possible, highly optimized libraries that take advantage of
specialized processor functionality are preferred.

In your case, np.dot() is a matrix-vector multiplication which internally calls  such a highly optimized BLAS routine. Those libraries are implemented in low-level languages like Fortan or C, they exist for many years now and are still unbeaten in terms of speed.
Your naive implementation of the convolution operation in python on the other hand is not optimized for execution speed and will be executed by the python interpreter (which is much slower than the compiled C functions).
You could try to replace your manual convolution by the SciPy's equivalent scipy.signal.convolve2d(), to make advantage of optimized libraries as well and get a speed up.