You can use the gdalwarp utility (http://www.gdal.org/gdalwarp.html) to subset an image, the command would be something like:
gdalwarp -te tilexmin tileymin tilexmax tileymax \
-t_srs targetproj.wkt \
-of GTiff \
bigmosaic.tiff smalltile.tif
Where 'targetproj.wkt' is a well known text file file containing the output projection (this can be the same as the input projection).
If you wrote a script to iterate through the image this would provide an easy way of splitting into tiles.
There is also a function in the open source library RSGISLib to do this: http://rsgislib.org/rsgislib_imageutils.html?highlight=createtiles#rsgislib.imageutils.createTiles
#!/usr/bin/env python
import rsgislib
from rsgislib import imageutils
inputImage = './Rasters/injune_p142_casi_sub_utm.kea'
outBase = './TestOutputs/Tiles/injune_p142_casi_sub_utm'
width = 100
height = width
overlap = 5
offsettiling = 0
format = 'KEA'
dataType = rsgislib.TYPE_32INT
ext='kea'
imageutils.createTiles(inputImage, outBase, width, height, overlap, offsettiling, gdalformat, dataType, ext)