If your contaminant bands are not separating from your protein of interest, they either they are associating with one another or they are the same size (in quaternary structure).
If you think they are interacting...some suggestions:
Ask yourself why they are associating. Try doing your NiNTA washes with 1M Na/KCl (or even try running your GF with 1M Na/KCl). Use some mild reducing agent in case there is potential your protein and the contaminants are crosslinking via disulfides (10mM mercaptoethanol in your NiNTA washes, or 5mM DTT in the GF). You could also try using a little non-denaturing detergent (e.g. 0.1% Triton) in your initial solubilization and NiNTA washes. Then wash out the detergent before eluting off the NiNTA. If you want get extreme, and you think your protein can refold, try doing the NiNTA purification in denaturing conditions (i.e. buffered 8M urea with some mercaptoethanol), then gently refold the protein by stepwise dialysis into lowering concentrations of urea until no urea is left.
Also just in case you didn't do it, always concentrate your protein to a volume of ~1% of the column volumn (e.g. if you have a 100mL GF column, concentration your protein to 1mL prior to injection/loading). If you do not get the volume down prior to GF, you will never get suitable separation.
If you know your protein and the contaminants aren't interacting but are just the same size, GF isn't the best means of separation. Try anion exchange or hydrophobic interaction. You could also try expressing with a cleavable affinity tag. The benefit is that once you elute your fusion protein from the affinity resin, you cleave your protein from the affinity tag, and then re-run it through the affinity resin. Doing this will not only remove the affinity tag and protease from your protein, allowing your protein of interest to flow thru, but any other contaminants that non-specifically stuck to the resin the first time through will stick again.
Or just use a different affinity tag than NiNTA (i.e. MBP, GST, strep)