Я думаю, что стандартный способ избежать dynamic_cast - добавить виртуальный метод в класс Texture:
virtual int get_texture_handle() const {return -1;}
Затем переопределить метод только в вашем классе GLTexture:
virtual int get_texture_handle() const {return gl_texture->handle;}
Тогда ваш код вызова будет выглядеть так:
int handle = texture->get_texture_handle();
if (handle >= 0) glBindTexture(GL_TEXTURE_2D, handle);