There shouldn't be any difference between these two. The result should be exactly the same whenever g is a finite element function. Try the following code:
from dolfin import *
mesh = UnitCubeMesh(8, 8, 8)
V = FunctionSpace(mesh, 'CG', 1)
Vv = VectorFunctionSpace(mesh, 'CG', 1)
v = TestFunction(V)
f = project(Expression(("x[1]", "sin(x[0])*cos(x[1]*x[2])", "x[0]")), Vv)
g = project(Expression("sin(x[0])*sin(x[1])*sin(x[2])"), V)
F1 = assemble(f[1]*g*dx)
F2 = (assemble(f[1]*v*dx) * g.vector()).sum()
print F1, F2
F1 = assemble(cross(f, grad(g))[0]*dx)
F2 = (assemble(cross(f, grad(v))[0]*dx) * g.vector()).sum()
print F1, F2
I think the difference in your case is either round-off error, as a result of choosing functions for which the combination of cross and grad returns something which is near zero.
If you find an interesting case which does not return the exact results, try to isolate the problem for as simple expressions as possible, in particular making all components of the vector function zero except one, and then rewrite the forms without using cross and grad (use instead g.dx(0) or similar), and then post your example code.