I decided to check this for C language, but identical arguments apply to C++, and similar arguments apply to Java (except Java allows signed overflow). Following code was tested (for C++, replace _Bool with bool).
_Bool approach1(int a, int b) {
    return a > 0 || b > 0;
}
_Bool approach2(int a, int b) {
    return (a + b) > 0;
}
And this was resulting disasembly.
    .file   "faster.c"
    .text
    .p2align 4,,15
    .globl  approach1
    .type   approach1, @function
approach1:
.LFB0:
    .cfi_startproc
    testl   %edi, %edi
    setg    %al
    testl   %esi, %esi
    setg    %dl
    orl %edx, %eax
    ret
    .cfi_endproc
.LFE0:
    .size   approach1, .-approach1
    .p2align 4,,15
    .globl  approach2
    .type   approach2, @function
approach2:
.LFB1:
    .cfi_startproc
    addl    %esi, %edi
    testl   %edi, %edi
    setg    %al
    ret
    .cfi_endproc
.LFE1:
    .size   approach2, .-approach2
    .ident  "GCC: (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]"
    .section    .note.GNU-stack,"",@progbits
Those codes are quite different, even considering how clever the compilers are these days. Why is that so? Well, the reason is quite simple - they aren't identical. If a is -42 and b is 2, the first approach will return true, and second will return false.
Surely, you may think that a and b should be unsigned.
    .file   "faster.c"
    .text
    .p2align 4,,15
    .globl  approach1
    .type   approach1, @function
approach1:
.LFB0:
    .cfi_startproc
    orl %esi, %edi
    setne   %al
    ret
    .cfi_endproc
.LFE0:
    .size   approach1, .-approach1
    .p2align 4,,15
    .globl  approach2
    .type   approach2, @function
approach2:
.LFB1:
    .cfi_startproc
    addl    %esi, %edi
    testl   %edi, %edi
    setne   %al
    ret
    .cfi_endproc
.LFE1:
    .size   approach2, .-approach2
    .ident  "GCC: (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]"
    .section    .note.GNU-stack,"",@progbits
It's quite easy to notice that approach1 is better here, because it doesn't do pointless addition, which is in fact, quite wrong. In fact, it even makes an optimization to (a | b) != 0, which is correct optimization.
In C, unsigned overflows are defined, so the compiler has to handle the case when integers are very high (try INT_MAX and 1 for approach2). Even assuming you know the numbers won't overflow, it's easy to notice approach1 is faster, because it simply tests if both variables are 0.
Trust your compiler, it will optimize better than you, and that without small bugs that you could accidentally write. Write code instead of asking yourself whether i++ or ++i is faster, or if x >> 1 or x / 2 is faster (by the way, x >> 1 doesn't do the same thing as x / 2 for signed numbers, because of rounding behavior).
If you want to optimize something, optimize algorithms you use. Instead of using worst case O(N4) sorting algorithm, use worst case O(N log N) algorithm. This will actually make program faster, especially if you sort reasonably big arrays