Well, first of all, your index buffer is too small, you have not only body_polygoncount indices, but body_polygoncount * 3 indices. You also messed up the type, since they are short, you need GLushort , not GLubyte , so it should be
glBufferData(GL_ELEMENT_ARRAY_BUFFER, body_polygoncount*3*sizeof(GLushort), body_index, GL_STATIC_DRAW);
And then you messed up the offsets of your attributes, since your data contains texture coords first, then normal, and then the position for each vertex, it should be
glVertexPointer(3, GL_FLOAT, sizeof(vertexStruct), (char *)NULL + 20 );
And finally, when you call glDrawElements you do not specify the number of triangles, but the number of elements (indices), so it should be
glDrawElements(GL_TRIANGLES, body_polygoncount*3, GL_UNSIGNED_SHORT, (GLvoid*)((char*)NULL));
Otherwise, your code looks reasonable (of course, the mapping was pointless, and you could just use glBufferData again, but I think you did it for training), and if you understand everything it does, there is nothing more.
But I'm curious that all of these errors would also occur if you only used client-side vertex arrays without VBOs, and I thought OpenGL ES 1.1 did not have glBegin/glEnd immediate mode. Therefore, I wonder why your game worked previously without VBOs, if you do not know about these errors.